Changeset 9373
- Timestamp:
- 08/23/11 07:22:50 (14 years ago)
- Location:
- issm/trunk/src/m/model
- Files:
-
- 5 deleted
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/m/model/marshall.m
r9078 r9373 32 32 error(['marshall error message: could not close file ' [md.name '.bin']]); 33 33 end 34 35 function WriteData(md,fid,template,field) % {{{ 36 %WRITEDATA - write model field in binary file 37 % 38 % Usage: 39 % WriteData(md,fid,template,field) 40 % 41 % Example: 42 % WriteData(md,fid,template,'thickness') 43 44 %first recover data, enum of the data and type of data 45 data=md.(field); 46 enum=BuildEnum(field); 47 data_type=template.(field){3}; 48 49 if issparse(data), 50 data=full(data); 51 end 52 53 %Ok! write the enum (name) to identify this record uniquely 54 fwrite(fid,enum,'int'); 55 56 %Now, write the data itself. 57 if strcmpi(data_type,'Boolean'),% {{{ 58 if(numel(data)~=1), error(['field ' field ' cannot be marshalled as it has more than one element!']); end 59 60 %first write length of record 61 fwrite(fid,4+4,'int'); %1 bool (disguised as an int)+code 62 63 %write data code: 64 fwrite(fid,TypeToCode(data_type),'int'); 65 66 %now write integer 67 fwrite(fid,data,'int'); %send an int, not easy to send a bool 68 % }}} 69 elseif strcmpi(data_type,'Integer'), % {{{ 70 if(numel(data)~=1), error(['field ' field ' cannot be marshalled as it has more than one element!']); end 71 72 %first write length of record 73 fwrite(fid,4+4,'int'); %1 integer + code 74 75 %write data code: 76 fwrite(fid,TypeToCode(data_type),'int'); 77 78 %now write integer 79 fwrite(fid,data,'int'); 80 % }}} 81 elseif strcmpi(data_type,'Double'), % {{{ 82 if(numel(data)~=1), error(['field ' field ' cannot be marshalled as it has more than one element!']); end 83 84 %first write length of record 85 fwrite(fid,8+4,'int'); %1 double+code 86 87 %write data code: 88 fwrite(fid,TypeToCode(data_type),'int'); 89 90 %now write double 91 fwrite(fid,data,'double'); 92 % }}} 93 elseif strcmpi(data_type,'String'), % {{{ 94 %first write length of record 95 fwrite(fid,length(data)+4+4,'int'); %string + string size + code 96 97 %write data code: 98 fwrite(fid,TypeToCode(data_type),'int'); 99 100 %now write string 101 fwrite(fid,length(data),'int'); 102 fwrite(fid,data,'char'); 103 % }}} 104 elseif strcmpi(data_type,'BooleanMat'), % {{{ 105 106 %matrix type: 107 mattype=template.(field){4}; 108 109 %Get size 110 s=size(data); 111 %if matrix = NaN, then do not write anything 112 if (s(1)==1 & s(2)==1 & isnan(data)), 113 s(1)=0; s(2)=0; 114 end 115 116 %first write length of record 117 fwrite(fid,4+4+8*s(1)*s(2)+4+4,'int'); %2 integers (32 bits) + the double matrix + code + matrix type 118 119 %write data code and matrix type: 120 fwrite(fid,TypeToCode(data_type),'int'); 121 fwrite(fid,mattype,'int'); 122 123 %now write matrix 124 fwrite(fid,s(1),'int'); 125 fwrite(fid,s(2),'int'); 126 if s(1)*s(2), 127 fwrite(fid,data','double'); %get to the "c" convention, hence the transpose 128 end 129 % }}} 130 elseif strcmpi(data_type,'IntMat'), % {{{ 131 132 %matrix type: 133 mattype=template.(field){4}; 134 135 %Get size 136 s=size(data); 137 %if matrix = NaN, then do not write anything 138 if (s(1)==1 & s(2)==1 & isnan(data)), 139 s(1)=0; s(2)=0; 140 end 141 142 %first write length of record 143 fwrite(fid,4+4+8*s(1)*s(2)+4+4,'int'); %2 integers (32 bits) + the double matrix + code + matrix type 144 145 %write data code and matrix type: 146 fwrite(fid,TypeToCode(data_type),'int'); 147 fwrite(fid,mattype,'int'); 148 149 %now write matrix 150 fwrite(fid,s(1),'int'); 151 fwrite(fid,s(2),'int'); 152 if s(1)*s(2), 153 fwrite(fid,data','double'); %get to the "c" convention, hence the transpose 154 end 155 % }}} 156 elseif strcmpi(data_type,'DoubleMat'), % {{{ 157 158 %matrix type: 159 mattype=template.(field){4}; 160 161 %Get size 162 s=size(data); 163 %if matrix = NaN, then do not write anything 164 if (s(1)==1 & s(2)==1 & isnan(data)), 165 s(1)=0; s(2)=0; 166 end 167 168 %first write length of record 169 fwrite(fid,4+4+8*s(1)*s(2)+4+4,'int'); %2 integers (32 bits) + the double matrix + code + matrix type 170 171 %write data code and matrix type: 172 fwrite(fid,TypeToCode(data_type),'int'); 173 fwrite(fid,mattype,'int'); 174 175 %now write matrix 176 fwrite(fid,s(1),'int'); 177 fwrite(fid,s(2),'int'); 178 if s(1)*s(2), 179 fwrite(fid,data','double'); %get to the "c" convention, hence the transpose 180 end 181 % }}} 182 elseif strcmpi(data_type,'MatArray'), % {{{ 183 184 numrecords=numel(data); 185 186 %first get length of record 187 recordlength=4+4; %number of records + code 188 for i=1:numrecords, 189 matrix=data{i}; 190 s=size(matrix); 191 recordlength=recordlength+4*2+... %row and col of matrix 192 s(1)*s(2)*8; %matrix of doubles 193 end 194 195 %write length of record 196 fwrite(fid,recordlength,'int'); 197 198 %write data code: 199 fwrite(fid,TypeToCode(data_type),'int'); 200 201 %write data, first number of records 202 fwrite(fid,numrecords,'int'); 203 204 %write each matrix: 205 for i=1:numrecords, 206 matrix=data{i}; 207 s=size(matrix); 208 fwrite(fid,s(1),'int'); 209 fwrite(fid,s(2),'int'); 210 fwrite(fid,matrix','double'); 211 end 212 % }}} 213 elseif strcmpi(data_type,'StringArray'), % {{{ 214 215 %first get length of string array: 216 num=numel(data); 217 %now get length of record: 218 recordlength=4+4; %for length of array + code 219 for i=1:num, 220 string=data{i}; 221 recordlength=recordlength+4+length(string); %for each string 222 end 223 224 %write length of record 225 fwrite(fid,recordlength,'int'); 226 227 %write data code: 228 fwrite(fid,TypeToCode(data_type),'int'); 229 230 %now write length of string array 231 fwrite(fid,num,'int'); 232 233 %now write the strings 234 for i=1:num, 235 string=data{i}; 236 fwrite(fid,length(string),'int'); 237 fwrite(fid,string,'char'); 238 end 239 % }}} 240 else 241 error(['WriteData error message: data type: ' num2str(data_type) ' not supported yet! (' EnumToString(enum) ')']); 242 end 243 % }}} 244 function code=TypeToCode(data_type) % {{{1 245 %This routine takes the data_type string, and hardcodes it into an integer, which 246 %is passed along the record, in order to identify the nature of the dataset being 247 %sent. 248 if strcmpi(data_type,'Boolean'), 249 code=1; 250 elseif strcmpi(data_type,'Integer'), 251 code=2; 252 elseif strcmpi(data_type,'Double'), 253 code=3; 254 elseif strcmpi(data_type,'String'), 255 code=4; 256 elseif strcmpi(data_type,'BooleanMat'), 257 code=5; 258 elseif strcmpi(data_type,'IntMat'), 259 code=6; 260 elseif strcmpi(data_type,'DoubleMat'), 261 code=7; 262 elseif strcmpi(data_type,'MatArray'), 263 code=8; 264 elseif strcmpi(data_type,'StringArray'), 265 code=9; 266 else 267 error('TypeToCode error message: data type not supported yet!'); 268 end% }}} -
issm/trunk/src/m/model/parseresultsfromdisk.m
r9221 r9373 13 13 %process patch if necessary 14 14 results=MatlabProcessPatch(results); 15 16 function results=parseresultsfromdiskioserial(filename) % {{{ 17 %PARSERESULTSFROMDISK - ... 18 % 19 % Usage: 20 % results=parseresultsfromdiskioserial(filename) 21 22 23 %Open file 24 fid=fopen(filename,'rb'); 25 if(fid==-1), 26 error(['loadresultsfromdisk error message: could not open ',filename,' for binary reading']); 27 end 28 results=struct(); 29 30 %Read fields until the end of the file. 31 result=ReadData(fid); 32 while ~isempty(result), 33 %Get time and step 34 results(result.step).step=result.step; 35 results(result.step).time=result.time; 36 37 %Add result 38 if (length(results)>=result.step & isfield(results,result.fieldname) & ~strcmp(result.fieldname,'SolutionType')), 39 results(result.step).(result.fieldname)=[ results(result.step).(result.fieldname); result.field]; 40 else 41 results(result.step).(result.fieldname)=result.field; 42 end 43 44 %read next result 45 result=ReadData(fid); 46 47 end 48 49 fclose(fid); 50 % }}} 51 function results=parseresultsfromdisk(filename) % {{{ 52 %PARSERESULTSFROMDISKIOSPLIT - ... 53 % 54 % Usage: 55 % results=parseresultsfromdiskiosplit(filename) 56 57 58 %Open file 59 fid=fopen(filename,'rb'); 60 if(fid==-1), 61 error(['loadresultsfromdisk error message: could not open ',filename,' for binary reading']); 62 end 63 results=struct(); 64 65 %if we have done split I/O, ie, we have results that are fragmented across patches, 66 %do a first pass, and figure out the structure of results 67 result=ReadDataDimensions(fid); 68 while ~isempty(result), 69 70 %Get time and step 71 results(result.step).step=result.step; 72 results(result.step).time=result.time; 73 74 %Add result 75 if strcmpi(result.fieldname,'Patch'), 76 results(result.step).(result.fieldname)=[0 result.N]; 77 else 78 results(result.step).(result.fieldname)=NaN; 79 end 80 81 %read next result 82 result=ReadDataDimensions(fid); 83 end 84 85 %do a second pass, and figure out the size of the patches 86 fseek(fid,0,-1); %rewind 87 result=ReadDataDimensions(fid); 88 while ~isempty(result), 89 90 %Add result 91 if strcmpi(result.fieldname,'Patch'), 92 patchdimensions=results(result.step).(result.fieldname); 93 results(result.step).(result.fieldname)=[patchdimensions(1)+result.M result.N]; 94 end 95 96 %read next result 97 result=ReadDataDimensions(fid); 98 end 99 100 %allocate patches 101 for i=1:length(results), 102 results(i).Patch=zeros(results(i).Patch(1),results(i).Patch(2)); 103 results(i).counter=1; %use to index into the patch 104 end 105 106 %third pass, this time to read the real information 107 fseek(fid,0,-1); %rewind 108 result=ReadData(fid); 109 while ~isempty(result), 110 111 %Get time and step 112 results(result.step).step=result.step; 113 results(result.step).time=result.time; 114 115 %Add result 116 if strcmpi(result.fieldname,'Patch'), 117 counter=results(result.step).counter; 118 counter2=counter+size(result.field,1)-1; 119 results(result.step).(result.fieldname)(counter:counter2,:)=result.field; 120 121 %increment counter: 122 results(result.step).counter=counter2+1; 123 else 124 results(result.step).(result.fieldname)=result.field; 125 end 126 127 %read next result 128 result=ReadData(fid); 129 130 end 131 132 %close file 133 fclose(fid); 134 % }}} 135 function result=ReadData(fid) % {{{ 136 %READDATA - ... 137 % 138 % Usage: 139 % field=ReadData(fid) 140 141 142 %read field 143 [length,count]=fread(fid,1,'int'); 144 145 if count==0, 146 result=struct([]); 147 else 148 fieldname=fread(fid,length,'char'); 149 fieldname=fieldname(1:end-1)'; 150 fieldname=char(fieldname); 151 time=fread(fid,1,'double'); 152 step=fread(fid,1,'int'); 153 154 type=fread(fid,1,'int'); 155 M=fread(fid,1,'int'); 156 if type==1, 157 field=fread(fid,M,'double'); 158 elseif type==2, 159 field=fread(fid,M,'char'); 160 field=char(field(1:end-1)'); 161 elseif type==3, 162 N=fread(fid,1,'int'); 163 field=transpose(fread(fid,[N M],'double')); 164 else 165 error(['cannot read data of type ' num2str(type) ]); 166 end 167 168 result.fieldname=fieldname; 169 result.time=time; 170 result.step=step; 171 result.field=field; 172 end 173 % }}} 174 function result=ReadDataDimensions(fid) % {{{ 175 %READDATA - read data dimensions, step and time, but not the data itself. 176 % 177 % Usage: 178 % field=ReadDataDimensions(fid) 179 180 181 %read field 182 [length,count]=fread(fid,1,'int'); 183 184 if count==0, 185 result=struct([]); 186 else 187 fieldname=fread(fid,length,'char'); 188 fieldname=fieldname(1:end-1)'; 189 fieldname=char(fieldname); 190 time=fread(fid,1,'double'); 191 step=fread(fid,1,'int'); 192 193 type=fread(fid,1,'int'); 194 M=fread(fid,1,'int'); 195 N=1; %default 196 if type==1, 197 fseek(fid,M*8,0); 198 elseif type==2, 199 fseek(fid,M,0); 200 elseif type==3, 201 N=fread(fid,1,'int'); 202 fseek(fid,N*M*8,0); 203 else 204 error(['cannot read data of type ' num2str(type) ]); 205 end 206 207 result.fieldname=fieldname; 208 result.time=time; 209 result.step=step; 210 result.M=M; 211 result.N=N; 212 end 213 % }}}
Note:
See TracChangeset
for help on using the changeset viewer.