source: issm/trunk-jpl/src/m/io/structtonc.m@ 15106

Last change on this file since 15106 was 15106, checked in by Mathieu Morlighem, 12 years ago

CHG: cosmetics, removed double blank lines

File size: 3.7 KB
Line 
1function [var_id,counter] = structtonc(ncid,fieldname,field,depth,var_id,counter,step);
2%STRUCTTONC- fill nc file with structure fields
3%
4% WARNING: Do not use this function, this function is called
5% by netcdf(model);
6%
7
8%update counter
9counter = counter+1;
10
11%Check that field is not empty
12if isempty(field) | (isa(field,'struct') & numel(fields(field))==0),
13 if(step==1), disp(['skipping ' fieldname ' (empty)...']); end
14 return;
15end
16
17%Write field class
18[var_id,counter] = declareclass(ncid,[fieldname '_class'],class(field),depth,var_id,counter,step);
19
20%Double scalar
21if isa(field,'double') & numel(field)==1,
22 if step==1,
23 var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_DOUBLE',[]);
24 else
25 netcdf.putVar(ncid,var_id(counter),field);
26 end
27
28%Double vector
29elseif isa(field,'double') & size(field,2)==1,
30 if step==1,
31 dim_id = netcdf.defDim(ncid,[fieldname '_size1'],size(field,1));
32 var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_DOUBLE',dim_id);
33 else
34 netcdf.putVar(ncid,var_id(counter),field);
35 end
36
37%double matrix
38elseif isa(field,'double') & size(field,2)>1,
39 if step==1,
40 dim1_id = netcdf.defDim(ncid,[fieldname '_size1'],size(field,1));
41 dim2_id = netcdf.defDim(ncid,[fieldname '_size2'],size(field,2));
42 var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_DOUBLE',[dim2_id dim1_id]);
43 else
44 netcdf.putVar(ncid,var_id(counter),transpose(field));
45 end
46
47%string
48elseif isa(field,'char')
49 if step==1,
50 dim_id = netcdf.defDim(ncid,[fieldname '_size1'],numel(field));
51 var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_CHAR',dim_id);
52 else
53 netcdf.putVar(ncid,var_id(counter),field);
54 end
55
56%Boolean of size 1
57elseif isa(field,'logical') & numel(field)==1,
58 if step==1,
59 var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_BYTE',[]);
60 else
61 netcdf.putVar(ncid,var_id(counter),int8(field));
62 end
63
64%Structures
65elseif isa(field,'struct'),
66 sublength = numel(field);
67 subfields = fields(field);
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,
89 for i=1:length(subfields),
90 [var_id,counter] = structtonc(ncid,[fieldname '.' subfields{i} '(' num2str(n) ')'],field(n).(subfields{i}),depth+1,var_id,counter,step);
91 end
92 end
93
94%Cell
95elseif isa(field,'cell'),
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,
104 [var_id,counter] = structtonc(ncid,[fieldname '{' num2str(i) '}'],field{i},depth+1,var_id,counter,step);
105 end
106
107%Objects
108elseif isobject(field),
109 subfields = fields(field);
110 for i=1:length(subfields),
111 [var_id,counter] = structtonc(ncid,[fieldname '.' subfields{i}],field.(subfields{i}),depth+1,var_id,counter,step);
112 end
113else
114 disp(['skipping ' fieldname ' (format not supported)...']);
115end
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;
Note: See TracBrowser for help on using the repository browser.