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

Last change on this file was 19157, checked in by bdef, 10 years ago

NEW: adding cluster (pfe) launch ability in python

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
31if step==1,
32 dim_id = netcdf.defDim(ncid,[fieldname '_size1'],size(field,1));
33 var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_DOUBLE',dim_id);
34 else
35 netcdf.putVar(ncid,var_id(counter),field);
36 end
37
38%double matrix
39elseif isa(field,'double') & size(field,2)>1,
40 if step==1,
41 dim1_id = netcdf.defDim(ncid,[fieldname '_size1'],size(field,1));
42 dim2_id = netcdf.defDim(ncid,[fieldname '_size2'],size(field,2));
43 var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_DOUBLE',[dim2_id dim1_id]);
44 else
45 netcdf.putVar(ncid,var_id(counter),transpose(field));
46 end
47
48%string
49elseif isa(field,'char')
50 if step==1,
51 dim_id = netcdf.defDim(ncid,[fieldname '_size1'],numel(field));
52 var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_CHAR',dim_id);
53 else
54 netcdf.putVar(ncid,var_id(counter),field);
55 end
56
57%Boolean of size 1
58elseif isa(field,'logical') & numel(field)==1,
59 if step==1,
60 var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_BYTE',[]);
61 else
62 netcdf.putVar(ncid,var_id(counter),int8(field));
63 end
64
65%Structures
66elseif isa(field,'struct'),
67 sublength = numel(field);
68 subfields = fields(field);
69 allsubfields = '';
70 for i=1:length(subfields),
71 allsubfields=[allsubfields subfields{i}];
72 if i~=length(subfields), allsubfields=[allsubfields ' ']; end
73 end
74 %Write size
75 if step==1,
76 var_id(counter) = netcdf.defVar(ncid,[fieldname '_length'],'NC_INT',[]);
77 else
78 netcdf.putVar(ncid,var_id(counter),sublength);
79 end
80 counter=counter+1;
81 %Write fields
82 if step==1,
83
84 dim_id = netcdf.defDim(ncid,[fieldname '_fields_length'],numel(allsubfields));
85 var_id(counter) = netcdf.defVar(ncid,[fieldname '_fields'],'NC_CHAR',dim_id);
86 else
87 netcdf.putVar(ncid,var_id(counter),allsubfields);
88 end
89 for n=1:sublength,
90 for i=1:length(subfields),
91 [var_id,counter] = structtonc(ncid,[fieldname '.' subfields{i} '(' num2str(n) ')'],field(n).(subfields{i}),depth+1,var_id,counter,step);
92 end
93 end
94
95%Cell
96elseif isa(field,'cell'),
97 sublength = numel(field);
98 %Write size
99 if step==1,
100 var_id(counter) = netcdf.defVar(ncid,[fieldname '_length'],'NC_INT',[]);
101 else
102 netcdf.putVar(ncid,var_id(counter),sublength);
103 end
104 for i=1:sublength,
105 [var_id,counter] = structtonc(ncid,[fieldname '{' num2str(i) '}'],field{i},depth+1,var_id,counter,step);
106 end
107
108%Objects
109elseif isobject(field),
110 subfields = fields(field);
111 for i=1:length(subfields),
112 [var_id,counter] = structtonc(ncid,[fieldname '.' subfields{i}],field.(subfields{i}),depth+1,var_id,counter,step);
113 end
114else
115 disp(['skipping ' fieldname ' (format not supported)...']);
116end
117
118function [var_id,counter] = declareclass(ncid,fieldname,field,depth,var_id,counter,step);
119
120if isa(field,'char')
121 if step==1,
122 dim_id = netcdf.defDim(ncid,[fieldname '_length'],numel(field));
123 var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_CHAR',dim_id);
124 else
125 netcdf.putVar(ncid,var_id(counter),field);
126 end
127else
128 error('class name is not a string');
129end
130
131%update counter
132counter = counter+1;
Note: See TracBrowser for help on using the repository browser.