Changeset 14639


Ignore:
Timestamp:
04/18/13 08:26:26 (12 years ago)
Author:
Mathieu Morlighem
Message:

CHG: better nc file

File:
1 edited

Legend:

Unmodified
Added
Removed
  • issm/trunk-jpl/src/m/io/structtonc.m

    r14630 r14639  
    1010
    1111%Check that field is not empty
    12 if isempty(field),
     12if isempty(field) | (isa(field,'struct') & numel(fields(field))==0),
    1313        if(step==1), disp(['skipping ' fieldname ' (empty)...']); end
    1414        return;
    1515end
     16
     17%Write field class
     18[var_id,counter] = declareclass(ncid,[fieldname '_class'],class(field),depth,var_id,counter,step);
    1619
    1720%Double scalar
     
    4851                        var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_CHAR',dim_id);
    4952                else
    50                         netcdf.putVar(ncid,var_id(counter),transpose(field));
     53                        netcdf.putVar(ncid,var_id(counter),field);
    5154                end
    5255
     
    6164%Structures
    6265elseif isa(field,'struct'),
     66        sublength = numel(field);
    6367        subfields = fields(field);
    64         sublength = numel(field);
    65         if sublength==1,
     68        allsubfields = '';
     69        for i=1:length(subfields),
     70                allsubfields=[allsubfields subfields{i}];
     71                if i~=length(subfields), allsubfields=[allsubfields ' ']; end
     72        end
     73        %Write size
     74        if step==1,
     75                var_id(counter) = netcdf.defVar(ncid,[fieldname '_length'],'NC_INT',[]);
     76        else
     77                netcdf.putVar(ncid,var_id(counter),sublength);
     78        end
     79        counter=counter+1;
     80        %Write fields
     81        if step==1,
     82
     83                dim_id          = netcdf.defDim(ncid,[fieldname '_fields_length'],numel(allsubfields));
     84                var_id(counter) = netcdf.defVar(ncid,[fieldname '_fields'],'NC_CHAR',dim_id);
     85        else
     86                netcdf.putVar(ncid,var_id(counter),allsubfields);
     87        end
     88        for n=1:sublength,
    6689                for i=1:length(subfields),
    67                         [var_id,counter] = structtonc(ncid,[fieldname '.' subfields{i}],field.(subfields{i}),depth+1,var_id,counter,step);
    68                 end
    69         else
    70                 for n=1:sublength,
    71                         for i=1:length(subfields),
    72                                 [var_id,counter] = structtonc(ncid,[fieldname '.' subfields{i} '(' num2str(n) ')'],field(n).(subfields{i}),depth+1,var_id,counter,step);
    73                         end
     90                        [var_id,counter] = structtonc(ncid,[fieldname '.' subfields{i} '(' num2str(n) ')'],field(n).(subfields{i}),depth+1,var_id,counter,step);
    7491                end
    7592        end
     
    7794%Cell
    7895elseif isa(field,'cell'),
    79         for i=1:length(field),
     96        sublength = numel(field);
     97        %Write size
     98        if step==1,
     99                var_id(counter) = netcdf.defVar(ncid,[fieldname '_length'],'NC_INT',[]);
     100        else
     101                netcdf.putVar(ncid,var_id(counter),sublength);
     102        end
     103        for i=1:sublength,
    80104                [var_id,counter] = structtonc(ncid,[fieldname '{' num2str(i) '}'],field{i},depth+1,var_id,counter,step);
    81105        end
     
    83107%Objects
    84108elseif isobject(field),
    85         %First we need to keep track of the object class name
    86         [var_id,counter] = structtonc(ncid,[fieldname '_class'],class(field),depth,var_id,counter,step);
    87109        subfields = fields(field);
    88110        for i=1:length(subfields),
     
    92114        disp(['skipping ' fieldname ' (format not supported)...']);
    93115end
     116
     117function [var_id,counter] = declareclass(ncid,fieldname,field,depth,var_id,counter,step);
     118
     119if isa(field,'char')
     120        if step==1,
     121                dim_id          = netcdf.defDim(ncid,[fieldname '_length'],numel(field));
     122                var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_CHAR',dim_id);
     123        else
     124                netcdf.putVar(ncid,var_id(counter),field);
     125        end
     126else
     127        error('class name is not a string');
     128end
     129
     130%update counter
     131counter   = counter+1;
     132
Note: See TracChangeset for help on using the changeset viewer.