source: issm/branches/trunk-jpl-damage/src/m/model/parseresultsfromdisk.m@ 11427

Last change on this file since 11427 was 10399, checked in by seroussi, 13 years ago

fixed process patch in MatlabProcessPatch for P0 in 3d

File size: 4.7 KB
Line 
1function results=parseresultsfromdisk(filename,iosplit)
2%PARSERESULTSFROMDISK - ...
3%
4% Usage:
5% results=parseresultsfromdisk(filename,iosplit)
6
7if iosplit,
8 results=parseresultsfromdiskiosplit(filename);
9else
10 results=parseresultsfromdiskioserial(filename);
11end
12
13%process patch if necessary
14results=MatlabProcessPatch(results);
15
16function results=parseresultsfromdiskioserial(filename) % {{{
17%PARSERESULTSFROMDISK - ...
18%
19% Usage:
20% results=parseresultsfromdiskioserial(filename)
21
22
23%Open file
24fid=fopen(filename,'rb');
25if(fid==-1),
26 error(['loadresultsfromdisk error message: could not open ',filename,' for binary reading']);
27end
28results=struct();
29
30%Read fields until the end of the file.
31result=ReadData(fid);
32while ~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
47end
48
49fclose(fid);
50% }}}
51function results=parseresultsfromdiskiosplit(filename) % {{{
52%PARSERESULTSFROMDISKIOSPLIT - ...
53%
54% Usage:
55% results=parseresultsfromdiskiosplit(filename)
56
57
58%Open file
59fid=fopen(filename,'rb');
60if(fid==-1),
61 error(['loadresultsfromdisk error message: could not open ',filename,' for binary reading']);
62end
63results=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
67result=ReadDataDimensions(fid);
68while ~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);
83end
84
85%do a second pass, and figure out the size of the patches
86fseek(fid,0,-1); %rewind
87result=ReadDataDimensions(fid);
88while ~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);
98end
99
100%allocate patches
101for 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
104end
105
106%third pass, this time to read the real information
107fseek(fid,0,-1); %rewind
108result=ReadData(fid);
109while ~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
130end
131
132%close file
133fclose(fid);
134 % }}}
135function result=ReadData(fid) % {{{
136%READDATA - ...
137%
138% Usage:
139% field=ReadData(fid)
140
141%read field
142[length,count]=fread(fid,1,'int');
143
144if count==0,
145 result=struct([]);
146else
147 fieldname=fread(fid,length,'char');
148 fieldname=fieldname(1:end-1)';
149 fieldname=char(fieldname);
150 time=fread(fid,1,'double');
151 step=fread(fid,1,'int');
152
153 type=fread(fid,1,'int');
154 M=fread(fid,1,'int');
155 if type==1,
156 field=fread(fid,M,'double');
157 elseif type==2,
158 field=fread(fid,M,'char');
159 field=char(field(1:end-1)');
160 elseif type==3,
161 N=fread(fid,1,'int');
162 field=transpose(fread(fid,[N M],'double'));
163 else
164 error(['cannot read data of type ' num2str(type) ]);
165 end
166
167 result.fieldname=fieldname;
168 result.time=time;
169 result.step=step;
170 result.field=field;
171end
172% }}}
173function result=ReadDataDimensions(fid) % {{{
174%READDATA - read data dimensions, step and time, but not the data itself.
175%
176% Usage:
177% field=ReadDataDimensions(fid)
178
179
180%read field
181[length,count]=fread(fid,1,'int');
182
183if count==0,
184 result=struct([]);
185else
186 fieldname=fread(fid,length,'char');
187 fieldname=fieldname(1:end-1)';
188 fieldname=char(fieldname);
189 time=fread(fid,1,'double');
190 step=fread(fid,1,'int');
191
192 type=fread(fid,1,'int');
193 M=fread(fid,1,'int');
194 N=1; %default
195 if type==1,
196 fseek(fid,M*8,0);
197 elseif type==2,
198 fseek(fid,M,0);
199 elseif type==3,
200 N=fread(fid,1,'int');
201 fseek(fid,N*M*8,0);
202 else
203 error(['cannot read data of type ' num2str(type) ]);
204 end
205
206 result.fieldname=fieldname;
207 result.time=time;
208 result.step=step;
209 result.M=M;
210 result.N=N;
211end
212% }}}
Note: See TracBrowser for help on using the repository browser.