source: trunk/src/sub_field.m @ 165

Last change on this file since 165 was 165, checked in by sommeria, 14 years ago

sub_field: small bug corrected for field attributes

File size: 14.8 KB
Line 
1%'sub_field': combines two input fields
2%-----------------------------------------------------------------------
3% function SubData=sub_field(Field,Field_1)
4%
5% OUPUT:
6% SubData: structure representing the resulting field
7%
8% INPUT:
9% UvData: main structure UvData associated to the uvmat GUI as 'UserData'
10% Field: cell of Matlab structures representing the input fields
11%
12%    -- TODO: need to be rationalized --
13
14function [SubData,errormsg]=sub_field(Field,Field_1)
15test_attr=0;
16if isfield(Field,'ListGlobalAttribute')
17    SubData.ListGlobalAttribute=Field.ListGlobalAttribute;
18    for ilist=1:numel(Field.ListGlobalAttribute)
19        AttrName=Field.ListGlobalAttribute{ilist};
20        eval(['SubData.' AttrName '=Field.' AttrName ';'])
21    end
22    test_attr=1;
23end
24if isfield(Field_1,'ListGlobalAttribute')
25    for ilist=1:numel(Field_1.ListGlobalAttribute)
26        test_1=1;
27        AttrName=Field_1.ListGlobalAttribute{ilist};
28        if test_attr
29            for i_prev=1:numel(Field.ListGlobalAttribute)
30                if isequal(Field.ListGlobalAttribute{i_prev},AttrName)
31                    test_1=0; %attribute already written
32                    eval(['Val=Field.' AttrName ';'])                 
33                    eval(['Val_1=Field_1.' AttrName ';'])
34                    if isequal(Val,Val_1)           
35                        break% data already written
36                    else
37                        eval(['SubData.' AttrName '_1=Field_1.' AttrName ';'])
38                    end
39                end
40            end
41        end
42        if test_1
43            eval(['SubData.' AttrName '=Field_1.' AttrName ';'])
44        end
45    end
46end
47SubData.ListVarName=Field.ListVarName;
48SubData.VarDimName=Field.VarDimName;
49if isfield(Field,'VarAttribute')
50    SubData.VarAttribute=Field.VarAttribute;
51end
52%reproduce Field by default
53for ivar=1:numel(Field.ListVarName)
54   VarName=Field.ListVarName{ivar};
55   eval(['SubData.' VarName '=Field.' VarName ';'])
56end
57
58%fields     
59[CellVarIndex,NbDim,VarTypeCell,errormsg]=find_field_indices(Field);
60if ~isempty(errormsg)
61    errormsg=['invalid  first input to sub_field:' errormsg];
62    return
63end
64[CellVarIndex_1,NbDim_1,VarTypeCell_1,errormsg]=find_field_indices(Field_1);
65if ~isempty(errormsg)
66    errormsg=['invalid second input to sub_field:' errormsg];
67    return
68end
69iselect=find(NbDim==2);
70if ~isequal(numel(iselect),1)
71    errormsg='invalid  first input to sub_field: it must  contain a single 2D field cell';
72    return
73end
74iselect_1=find(NbDim_1==2);
75if ~isequal(numel(iselect_1),1)
76    errormsg='invalid  second input to sub_field: it must  contain a single 2D field cell';
77    return
78end
79% VarIndex=CellVarIndex{iselect};
80% VarIndex_1=CellVarIndex_1{iselect_1};
81VarType=VarTypeCell{iselect};
82VarType_1=VarTypeCell_1{iselect_1};
83testX=~isempty(VarType.coord_x)&& ~isempty(VarType.coord_y);%unstructured coordiantes
84testX_1=~isempty(VarType_1.coord_x)&& ~isempty(VarType_1.coord_y);%unstructured coordiantes
85testU=~isempty(VarType.vector_x)&& ~isempty(VarType.vector_y);%vector field
86testU_1=~isempty(VarType_1.vector_x)&& ~isempty(VarType_1.vector_y);%vector field
87% testfalse=~isempty(VarType.errorflag);
88testfalse_1=~isempty(VarType_1.errorflag);
89ivar_C=[VarType.scalar VarType.image VarType.color VarType.ancillary]; %defines index (indices) for the scalar or ancillary fields
90if numel(ivar_C)>1
91    errormsg='too many scalar fields in the first input of sub_field.m';
92    return
93end
94ivar_C_1=[VarType_1.scalar VarType_1.image VarType_1.color VarType_1.ancillary]; %defines index (indices) for the scalar or ancillary fields
95if numel(ivar_C_1)>1
96    errormsg='too many scalar fields in the second input of sub_field.m';
97    return
98end
99
100%substract two vector fields or two scalars
101if (testU && testU_1) || (~testU && ~testU_1)
102   %check coincidence in positions
103   %unstructured coordinates
104   if testX     
105       if testU % vector fields
106            U_1_Name=Field_1.ListVarName{VarType_1.vector_x};
107            V_1_Name=Field_1.ListVarName{VarType_1.vector_y};
108            eval(['vec_U_1=Field_1.' U_1_Name ';'])
109            eval(['vec_V_1=Field_1.' V_1_Name ';'])
110            nbpoints_x_1=size(vec_U_1,2);
111            nbpoints_y_1=size(vec_U_1,1);
112            vec_U_1=reshape(vec_U_1,nbpoints_x_1*nbpoints_y_1,1);
113            vec_V_1=reshape(vec_V_1,nbpoints_x_1*nbpoints_y_1,1);
114            if testfalse_1
115                vec_U_1=vec_U_1(indsel);
116                vec_V_1=vec_V_1(indsel);
117            end           
118       else %(~testU && ~testU_1)
119           A_1_Name=Field_1.ListVarName{ivar_C_1};
120           eval(['vec_A_1=Field_1.' A_1_Name ';'])   
121           nbpoints_x_1=size(vec_A_1,2);
122           nbpoints_y_1=size(vec_A_1,1);%TODO: use a faster interpolation method for a regular grid (size(x)=2)
123           vec_A_1=reshape(vec_A_1,nbpoints_x_1*nbpoints_y_1,1);
124           if testfalse_1
125                vec_A_1=vec_A_1(indsel);
126           end
127       end
128       XName=Field.ListVarName{VarType.coord_x};
129       YName=Field.ListVarName{VarType.coord_y};
130       eval(['vec_X=Field.' XName ';'])
131       eval(['vec_Y=Field.' YName ';'])
132       nbpoints=numel(vec_X);
133       vec_X=reshape(vec_X,nbpoints,1);
134       vec_Y=reshape(vec_Y,nbpoints,1);
135       if testX_1 %unstructured coordinates for the second field
136            X_1_Name=Field_1.ListVarName{VarType_1.coord_x};
137            Y_1_Name=Field_1.ListVarName{VarType_1.coord_y};
138            eval(['vec_X_1=Field_1.' X_1_Name ';'])
139            eval(['vec_Y_1=Field_1.' Y_1_Name ';'])
140
141       else   %structured coordinates for the second field
142           y_1_Name=Field_1.ListVarName{VarType_1.coord(1)};
143           x_1_Name=Field_1.ListVarName{VarType_1.coord(2)};
144           eval(['y_1=Field_1.' y_1_Name ';'])
145           eval(['x_1=Field_1.' x_1_Name ';'])
146           if isequal(numel(x_1),2) 
147               x_1=linspace(x_1(1),x_1(2),nbpoints_x_1);
148           end
149           if isequal(numel(y_1),2) 
150               y_1=linspace(y_1(1),y_1(2),nbpoints_y_1);
151           end
152           [vec_X_1,vec_Y_1]=meshgrid(x_1,y_1);
153       end
154       vec_X_1=reshape(vec_X_1,nbpoints_x_1*nbpoints_y_1,1);
155       vec_Y_1=reshape(vec_Y_1,nbpoints_x_1*nbpoints_y_1,1);
156       if testfalse_1
157           FFName_1=Field_1.ListVarName{VarType_1.errorflag};         
158           eval(['vec_FF_1=Field_1.' FFName_1 ';'])
159           vec_FF_1=reshape(vec_FF_1,nbpoints_1,1);
160           indsel=find(~vec_FF_1);
161           vec_X_1=vec_X_1(indsel);
162           vec_Y_1=vec_Y_1(indsel);
163       end
164       if ~isequal(vec_X_1,vec_X) && ~isequal(vec_Y_1,vec_Y) % if the unstructured positions are not the same
165           if testU
166               vec_U_1=griddata_uvmat(vec_X_1,vec_Y_1,vec_U_1,vec_X,vec_Y);  %interpolate vectors in the second field
167               vec_V_1=griddata_uvmat(vec_X_1,vec_Y_1,vec_V_1,vec_X,vec_Y);  %interpolate vectors in the second field   
168           else
169               vec_A_1=griddata_uvmat(vec_X_1,vec_Y_1,double(vec_A_1),vec_X,vec_Y);  %interpolate vectors in the second field
170           end
171       end
172       if testU
173           UName=Field.ListVarName{VarType.vector_x};
174           VName=Field.ListVarName{VarType.vector_y}; 
175           eval(['vec_U=Field.' UName ';'])
176           eval(['vec_V=Field.' VName ';'])       
177           vec_U=reshape(vec_U,numel(vec_U),1);
178           vec_V=reshape(vec_V,numel(vec_V),1);
179           eval(['SubData.' UName '=vec_U-vec_U_1;'])
180           eval(['SubData.' VName '=vec_V-vec_V_1;'])
181       else
182           AName=Field.ListVarName{ivar_C};
183          % size(Field.vort)
184           eval(['SubData.' AName '=Field.' AName '-vec_A_1;'])
185       end
186   else  %structured coordiantes
187       XName=Field.ListVarName{VarType.coord(2)};
188       YName=Field.ListVarName{VarType.coord(1)};
189       eval(['x=Field.' XName ';'])
190       eval(['y=Field.' YName ';'])
191       if testX_1 %unstructured coordinates for the second field
192           errormsg='the second input scalar is not on a regular grid: comparison option not implemented';
193           return
194       else
195           XName_1=Field.ListVarName{VarType_1.coord(2)};
196           YName_1=Field.ListVarName{VarType_1.coord(1)};
197           eval(['x_1=Field_1.' XName_1 ';'])
198           eval(['y_1=Field_1.' YName_1 ';'])
199       end
200       if testU % vector fields
201           UName=Field.ListVarName{VarType.vector_x};
202           VName=Field.ListVarName{VarType.vector_y};
203           U_1_Name=Field_1.ListVarName{VarType_1.vector_x};
204           V_1_Name=Field_1.ListVarName{VarType_1.vector_y};
205           eval(['U_1=Field_1.' U_1_Name ';'])
206           eval(['V_1=Field_1.' V_1_Name ';'])
207           if ~isequal(x_1,x)||~isequal(y_1,y)
208                [X_1,Y_1]=meshgrid(x_1,y_1);
209                U_1 =interp2(X_1,Y_1,U_1,x,y');
210                V_1 =interp2(X_1,Y_1,V_1,x,y');
211           end
212           eval(['SubData.' UName '=Field.' UName '-U_1;'])
213           eval(['SubData.' VName '=Field.' VName '-V_1;'])
214       else
215           AName=Field.ListVarName{ivar_C};
216           A_1_Name=Field_1.ListVarName{ivar_C_1};
217           eval(['A_1=double(Field_1.' A_1_Name ');'])
218           if ~isequal(x_1,x)||~isequal(y_1,y)
219                [X_1,Y_1]=meshgrid(x_1,y_1);
220                A_1 =interp2(X_1,Y_1,A_1,x,y');
221           end
222           eval(['SubData.' AName '=double(Field.' AName ')-A_1;'])
223       end
224   end
225end
226
227% merge a vector field and a scalar as second input
228if testU && ~testU_1
229    AName_1=Field_1.ListVarName{ivar_C_1};
230    if isfield(Field_1,'VarAttribute') && numel(Field_1.VarAttribute)>=ivar_C_1
231        AAttr=Field_1.VarAttribute{ivar_C_1} ;
232    else
233        AAttr=[];
234    end
235    if testX_1 %unstructured coordinate
236       XName_1=Field_1.ListVarName{VarType_1.coord_x};
237       YName_1=Field_1.ListVarName{VarType_1.coord_y};
238       %SubData.ListVarName=[SubData.ListVarName {XName_1} {YName_1}];
239       DimCell=Field_1.VarDimName([VarType_1.coord_x VarType_1.coord_y ]);
240       if isfield(Field_1,'VarAttribute')
241           if numel(Field_1.VarAttribute)>=VarType_1.coord_x
242                XAttr=Field_1.VarAttribute{VarType_1.coord_x} ;
243           else
244                XAttr=[];
245           end
246           if numel(Field_1.VarAttribute)>=VarType_1.coord_y
247               YAttr=Field_1.VarAttribute{VarType_1.coord_y} ;
248           else
249               YAttr=[];
250           end
251           SubData.VarAttribute=[SubData.VarAttribute {XAttr} {YAttr}];
252       end
253    else
254       XName_1=Field_1.ListVarName{VarType_1.coord(2)};
255       YName_1=Field_1.ListVarName{VarType_1.coord(1)};
256%        DimCell=[{YName_1} {XName_1}];
257       if isfield(Field_1,'VarAttribute')
258           if numel(Field_1.VarAttribute)>=VarType_1.coord(2)
259                XAttr=Field_1.VarAttribute{VarType_1.coord(2)} ;
260           else
261                XAttr=[];
262           end
263           if numel(Field_1.VarAttribute)>=VarType_1.coord(1)
264               YAttr=Field_1.VarAttribute{VarType_1.coord(1)} ;
265           else
266               YAttr=[];
267           end
268           SubData.VarAttribute=[SubData.VarAttribute {YAttr} {XAttr}];
269       end
270    end 
271    %look for previously used variable names
272    XName_1_1=XName_1;%default
273    YName_1_1=YName_1;%default
274    AName_1_1=AName_1;%default
275    for iprev=1:numel(SubData.ListVarName)
276        switch SubData.ListVarName{iprev}
277            case XName_1
278                XName_1_1=[XName_1 '_1'];
279            case YName_1
280                YName_1_1=[YName_1 '_1'];
281            case AName_1
282                AName_1_1=[AName_1 '_1'];
283        end
284    end     
285    if ~testX_1
286          DimCell=[{XName_1_1} {YName_1_1}];
287    end
288    SubData.ListVarName=[SubData.ListVarName {XName_1_1} {YName_1_1} {AName_1_1}];
289    DimCell=[DimCell Field_1.VarDimName(ivar_C_1)]; %(TODO: check for dimension names)
290    SubData.VarDimName=[SubData.VarDimName DimCell];
291    if isfield(Field_1,'VarAttribute')
292        SubData.VarAttribute=[SubData.VarAttribute {AAttr}];
293    end
294    eval(['SubData.' XName_1_1 '=Field_1.' XName_1 ';'])
295    eval(['SubData.' YName_1_1 '=Field_1.' YName_1 ';'])
296    eval(['SubData.' AName_1_1 '=Field_1.' AName_1 ';'])
297end
298
299%merge a scalar as the first input and a vector field as second input
300if ~testU && testU_1
301    UName_1=Field_1.ListVarName{VarType_1.vector_x};
302    VName_1=Field_1.ListVarName{VarType_1.vector_y};
303    UAttr=Field_1.VarAttribute{VarType_1.vector_x};
304    VAttr=Field_1.VarAttribute{VarType_1.vector_y};
305    if testX_1 %unstructured coordinate for the second field
306       XName_1=Field_1.ListVarName{VarType_1.coord_x};
307       YName_1=Field_1.ListVarName{VarType_1.coord_y};
308       
309       XAttr=Field_1.VarAttribute{VarType_1.coord_x};
310       YAttr=Field_1.VarAttribute{VarType_1.coord_y};
311%        SubData.ListVarName=[SubData.ListVarName {XName_1} {YName_1}];
312       DimCell=Field_1.VarDimName([VarType_1.coord_x VarType_1.coord_y ]);
313    else
314       XName_1=Field_1.ListVarName{VarType_1.coord(2)};
315       YName_1=Field_1.ListVarName{VarType_1.coord(1)};
316       if numel(Field_1.VarAttribute)>=VarType_1.coord(2)
317           XAttr=Field_1.VarAttribute{VarType_1.coord(2)};
318       else
319           XAttr=[];
320       end
321       if numel(Field_1.VarAttribute)>=VarType_1.coord(1)
322           YAttr=Field_1.VarAttribute{VarType_1.coord(1)};
323       else
324           YAttr=[];
325       end     
326    end 
327    %check for the existence of the same  variable name
328    XName_1_1=XName_1; %default
329    YName_1_1=YName_1; %default
330    UName_1_1=UName_1; %default
331    VName_1_1=VName_1; %default
332    for iprev=1:numel(SubData.ListVarName)
333        switch SubData.ListVarName{iprev}
334            case XName_1
335                XName_1_1=[XName_1 '_1'];
336            case YName_1
337                YName_1_1=[YName_1 '_1'];
338            case UName_1
339                UName_1_1=[UName_1 '_1'];
340            case VName_1
341                VName_1_1=[VName_1 '_1'];
342        end
343    end     
344    if ~testX_1
345          DimCell=[{XName_1_1} {YName_1_1}];
346    end
347    SubData.ListVarName=[SubData.ListVarName {XName_1_1} {YName_1_1} {UName_1_1} {VName_1_1}];
348    DimCell=[DimCell Field_1.VarDimName([VarType_1.vector_x VarType_1.vector_y ])];
349    SubData.VarDimName=[SubData.VarDimName DimCell];
350    if isfield(SubData,'VarAttribute')
351        if ~(numel(SubData.VarAttribute)==numel(SubData.ListVarName))
352            for ivar=numel(SubData.VarAttribute)+1:numel(SubData.ListVarName)-4
353                SubData.VarAttribute{ivar}=[];
354            end
355        end
356        SubData.VarAttribute=[SubData.VarAttribute {XAttr} {YAttr} {UAttr} {VAttr}];
357    end
358    eval(['SubData.' XName_1_1 '=Field_1.' XName_1 ';'])
359    eval(['SubData.' YName_1_1 '=Field_1.' YName_1 ';'])
360    eval(['SubData.' UName_1_1 '=Field_1.' UName_1 ';'])
361    eval(['SubData.' VName_1_1 '=Field_1.' VName_1 ';']) 
362end
363
364 
Note: See TracBrowser for help on using the repository browser.