Changeset 9373


Ignore:
Timestamp:
08/23/11 07:22:50 (14 years ago)
Author:
Mathieu Morlighem
Message:

reduced number of files for marshall and parseresults by merging files

Location:
issm/trunk/src/m/model
Files:
5 deleted
2 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk/src/m/model/marshall.m

    r9078 r9373  
    3232        error(['marshall error message: could not close file ' [md.name '.bin']]);
    3333end
     34
     35function 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
     45data=md.(field);
     46enum=BuildEnum(field);
     47data_type=template.(field){3};
     48
     49if issparse(data),
     50        data=full(data);
     51end
     52
     53%Ok! write the enum (name) to identify this record uniquely
     54fwrite(fid,enum,'int');
     55
     56%Now, write the data itself.
     57if     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        % }}}
     69elseif 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        % }}}
     81elseif 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        % }}}
     93elseif 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        % }}}
     104elseif 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        % }}}
     130elseif 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        % }}}
     156elseif 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        % }}}
     182elseif 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        % }}}
     213elseif 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        % }}}
     240else
     241        error(['WriteData error message: data type: ' num2str(data_type) ' not supported yet! (' EnumToString(enum) ')']);
     242end
     243% }}}
     244function 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.
     248if     strcmpi(data_type,'Boolean'),
     249        code=1;
     250elseif strcmpi(data_type,'Integer'),
     251        code=2;
     252elseif strcmpi(data_type,'Double'),
     253        code=3;
     254elseif strcmpi(data_type,'String'),
     255        code=4;
     256elseif strcmpi(data_type,'BooleanMat'),
     257        code=5;
     258elseif strcmpi(data_type,'IntMat'),
     259        code=6;
     260elseif strcmpi(data_type,'DoubleMat'),
     261        code=7;
     262elseif strcmpi(data_type,'MatArray'),
     263        code=8;
     264elseif strcmpi(data_type,'StringArray'),
     265        code=9;
     266else
     267        error('TypeToCode error message: data type not supported yet!');
     268end% }}}
  • issm/trunk/src/m/model/parseresultsfromdisk.m

    r9221 r9373  
    1313%process patch if necessary
    1414results=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=parseresultsfromdisk(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
     142%read field
     143[length,count]=fread(fid,1,'int');
     144
     145if count==0,
     146        result=struct([]);
     147else
     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;
     172end
     173% }}}
     174function 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
     184if count==0,
     185        result=struct([]);
     186else
     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;
     212end
     213% }}}
Note: See TracChangeset for help on using the changeset viewer.