source: issm/trunk/src/m/model/plot/processdata.m@ 7098

Last change on this file since 7098 was 7098, checked in by Mathieu Morlighem, 14 years ago

Better plot

File size: 4.7 KB
Line 
1function [data datatype]=processdata(md,data,options);
2%PROCESSDATA - process data to be plotted
3%
4% datatype = 1 -> elements
5% datatype = 2 -> nodes
6% datatype = 3 -> node quivers
7% datatype = 4 -> patch
8%
9% Usage:
10% [data datatype]=processdata(md,data,options);
11%
12% See also: PLOTMODEL, PROCESSMESH
13
14%check format
15if (iscell(data) | isempty(data) | length(data)==0 | (length(data)==1 & ~isstruct(data) & isnan(data))),
16 error('plotmodel error message: data provided is empty');
17end
18
19%Process Patch
20if isstruct(data)
21 if (isfield(data,'index') & isfield(data,'value')),
22 if data.interpolation(1)==P1Enum(),
23 data=data.value;
24 data=data';
25 data=data(:);
26 datatype=4;
27 elseif data.interpolation(1)==P0Enum(),
28 data=data.value;
29 datatype=5;
30 else
31 error(['interpolation ' data.interpolation(1) ' not supported yet']);
32 end
33 else
34 error('structure other than Patch not supported yet');
35 end
36else
37 %initialize datatype
38 datatype=0;
39end
40
41%get datatype
42datasize=size(data);
43
44%non patch processing
45if datatype~=4 & datatype~=5,
46
47 %transpose data if necessary
48 if (size(data,2) > size(data,1)),
49 data=data';
50 end
51 datasize=size(data);
52
53 %convert to double if necessary
54 if ~isnumeric(data);
55 disp('processdata info message: data is not numeric (logical?). Converted to double');
56 data=double(data);
57 end
58
59 %check length
60 if datasize(1)~=md.numberofgrids & datasize(1)~=md.numberofelements & datasize(1)~=md.numberofgrids*6 & (md.dim==3 & ~(datasize(1)==md.numberofelements2d | datasize(1)==md.numberofgrids2d))
61 error('plotmodel error message: data not supported yet');
62 end
63
64 %quiver?
65 if datasize(2)>1,
66 datatype=3;
67
68 %check number of columns, add zeros if necessary,
69 if (md.dim==3)
70 if datasize(2)==2,
71 data=[data, zeros(datasize(1),1)];
72 elseif datasize(2)~=3,
73 error('plotmodel error message: data provided should have 2 or 3 columns for quiver plot, and 1 for regular plot');
74 end
75 %elseif ((md.dim==2) & datasize(2)~=2),
76 % error('plotmodel error message: data provided should have 2 columns for quiver plot, and 1 for regular plot');
77 end
78 end
79
80 %treat the case datasize(1)=6*grids
81 if datasize(1)==6*md.numberofgrids
82 %keep the only norm of data
83 data1=data(1:6:md.numberofgrids*6,:);
84 data2=data(2:6:md.numberofgrids*6,:);
85 data=sqrt(data1.^2+data2.^2);
86 datasize(1)=md.numberofgrids;
87 %---> go to grid data
88 end
89
90 %treat the case datasize(1)=grids2d
91 if (md.dim==3 & datasize(1)==md.numberofgrids2d),
92 data=project3d(md,data,'node');
93 datasize(1)=md.numberofgrids;
94 %---> go to grid data
95 end
96
97 %treat the case datasize(1)=grids2d
98 if (md.dim==3 & datasize(1)==md.numberofelements2d),
99 data=project3d(md,data,'element');
100 datasize(1)=md.numberofelements;
101 %---> go to grid data
102 end
103
104 %smoothing?
105 if exist(options,'smooth')
106 data=averaging(md,data,getfieldvalue(options,'smooth'));
107 datasize(1)=md.numberofgrids;
108 %---> go to grid data
109 end
110end
111
112%element data
113if (datasize(1)==md.numberofelements & datasize(2)==1),
114
115 %Initialize datatype if non patch
116 if datatype~=4 & datatype~=5,
117 datatype=1;
118 end
119
120 %ice sheet only?
121 if getfieldvalue(options,'iceshelf',1)==0,
122 data(find(md.elementoniceshelf),:)=NaN;
123 end
124 %ice shelf only?
125 if getfieldvalue(options,'icesheet',1)==0,
126 data(find(~md.elementoniceshelf),:)=NaN;
127 end
128 %no water?
129 if getfieldvalue(options,'water',1)==0,
130 data(find(md.elementonwater),:)=NaN;
131 end
132 %log?
133 if exist(options,'log'),
134 bounds=getfieldvalue(options,'caxis',[min(data(:)) max(data(:))]);
135 data(find(data<bounds(1)))=bounds(1);
136 if any(data<=0),
137 error('Log option cannot be applied on negative values. Use caxis option (Rignot''s settings: [1.5 max(data)])');
138 end
139 pos=find(~isnan(data));
140 data(pos)=log(data(pos))/log(getfieldvalue(options,'log'));
141 end
142end
143
144%grid data
145if (datasize(1)==md.numberofgrids & datasize(2)==1),
146 datatype=2;
147 %ice sheet only?
148 if getfieldvalue(options,'iceshelf',1)==0,
149 pos=find(md.gridoniceshelf);
150 data(pos,:)=NaN;
151 end
152 %ice shelf only?
153 if getfieldvalue(options,'icesheet',1)==0,
154 pos=find(md.gridonicesheet);
155 data(pos,:)=NaN;
156 end
157 %no water?
158 if getfieldvalue(options,'water',1)==0,
159 pos=find(md.gridonwater);
160 data(pos,:)=NaN;
161 end
162 %log?
163 if exist(options,'log'),
164 %if any(data<=0),
165 % error('Log option cannot be applied on negative values. Use caxis option (Rignot''s settings: [1.5 max(data)])');
166 %end
167 data=log(data)/log(getfieldvalue(options,'log'));
168 end
169
170end
171
172%layer projection?
173if getfieldvalue(options,'layer',0)>=1,
174 data=project2d(md,data,getfieldvalue(options,'layer')); %project onto 2d mesh
175end
176
177%control arrow density if quiverplot
178if datatype==3 & exist(options,'density')
179 databak=data;
180 data=NaN*ones(datasize);
181 density=getfieldvalue(options,'density');
182 data(1:density:end,:)=databak(1:density:end,:);
183 clear databak
184end
Note: See TracBrowser for help on using the repository browser.