Changeset 14609


Ignore:
Timestamp:
04/16/13 15:41:07 (12 years ago)
Author:
Mathieu Morlighem
Message:

NEW: second prototype of netcdf file from md (much faster)

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/m/classes/model/model.m

    r14603 r14609  
    11691169                netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Author',getenv('USER'));
    11701170                netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Date',datestr(now));
     1171
     1172                %2. prepare some simple dimensions
     1173                var_id=zeros(300,1);%preallocate
     1174
     1175                %2. First round: define variables (step=1), put variable (step=2)
     1176                fields1=properties('model');
     1177
     1178                for step=1:2,
     1179                        counter=0;
     1180                        for i=1:length(fields1),
     1181                                fields2=fields(obj.(fields1{i}));
     1182                                for j=1:length(fields2)
     1183                                        counter   = counter+1;
     1184                                        fieldname = [fields1{i} '.' fields2{j}];
     1185                                        field     = obj.(fields1{i}).(fields2{j});
     1186                                        if isa(field,'double') & numel(field)==1,
     1187                                                if step==1,
     1188                                                        var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_DOUBLE',[]);
     1189                                                else
     1190                                                        netcdf.putVar(ncid,var_id(counter),field);
     1191                                                end
     1192                                        elseif isa(field,'double') & size(field,2)==1,
     1193                                                if step==1,
     1194                                                        dim_id          = netcdf.defDim(ncid,[fieldname '_size1'],size(field,1));
     1195                                                        var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_DOUBLE',dim_id);
     1196                                                else
     1197                                                        netcdf.putVar(ncid,var_id(counter),field);
     1198                                                end
     1199                                        elseif isa(field,'double') & size(field,2)>1,
     1200                                                if step==1,
     1201                                                        dim1_id         = netcdf.defDim(ncid,[fieldname '_size1'],size(field,1));
     1202                                                        dim2_id         = netcdf.defDim(ncid,[fieldname '_size2'],size(field,2));
     1203                                                        var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_DOUBLE',[dim2_id dim1_id]);
     1204                                                else
     1205                                                        netcdf.putVar(ncid,var_id(counter),transpose(field));
     1206                                                end
     1207                                        elseif isa(field,'char') & ~isempty(field),
     1208                                                if step==1,
     1209                                                        dim_id          = netcdf.defDim(ncid,[fieldname '_size1'],numel(field));
     1210                                                        var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_CHAR',dim_id);
     1211                                                else
     1212                                                        netcdf.putVar(ncid,var_id(counter),transpose(field));
     1213                                                end
     1214                                        elseif isa(field,'logical') & numel(field)==1,
     1215                                                if step==1,
     1216                                                        var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_BYTE',[]);
     1217                                                else
     1218                                                        netcdf.putVar(ncid,var_id(counter),int8(field));
     1219                                                end
     1220                                        else
     1221                                                disp(['skipping ' fieldname '...']);
     1222                                        end
     1223                                end
     1224
     1225                        end
     1226
     1227                        if step==1, netcdf.endDef(ncid); end
     1228                end
     1229                if counter>300,
     1230                        warning('preallocation of var_id need to be updated');
     1231                end
     1232
    11711233                netcdf.close(ncid)
    1172 
    1173                 %2. First round: define dimensions
    1174                 fields1=properties('model');
    1175                 for i=1:length(fields1),
    1176                         subfields=fields(obj.(fields1{i}));
    1177                         for j=1:length(subfields)
    1178                                 fieldname = [fields1{i} '.' subfields{j}];
    1179                                 field = obj.(fields1{i}).(subfields{j});
    1180                                 fieldname
    1181                                 if isa(field,'double') & numel(field)==1,
    1182                                         nccreate(filename,fieldname);
    1183                                         ncwrite( filename,fieldname,field);
    1184                                 elseif isa(field,'double') & size(field,2)==1,
    1185                                         nccreate(filename,fieldname,'Dimensions',{[fieldname '_length'] size(field,1)});
    1186                                         ncwrite(filename ,fieldname,field);
    1187                                 elseif isa(field,'double') & size(field,2)>1,
    1188                                         nccreate(filename,fieldname,'Dimensions',{[fieldname '_size2'] size(field,2) [fieldname '_size1'] size(field,1)});
    1189                                         ncwrite(filename ,fieldname,transpose(field));
    1190                                 elseif isa(field,'char') & ~isempty(field),
    1191                                         nccreate(filename,fieldname,'Dimensions',{[fieldname '_length'] numel(field)},'DataType','char');
    1192                                         ncwrite( filename,fieldname,field);
    1193                                 elseif isa(field,'logical') & numel(field)==1,
    1194                                         nccreate(filename,fieldname,'DataType','int8');
    1195                                         ncwrite( filename,fieldname,int8(field));
    1196                                 else
    1197                                         disp(['skipping ' fieldname '...']);
    1198                                 end
    1199                         end
    1200                 end
    12011234                end % }}}
    12021235                function xylim(obj) % {{{
Note: See TracChangeset for help on using the changeset viewer.