source: trunk/src/calc_field_interp.m @ 660

Last change on this file since 660 was 654, checked in by sommeria, 8 years ago

various bugs corrected

File size: 6.6 KB
Line 
1%'calc_field_interp': calculate fields (velocity, vort, div...) using linear interpolation if requested
2%---------------------------------------------------------------------
3% [VarVal,ListVarName,VarAttribute,errormsg]=calc_field_interp(Coord,Data,FieldName,XI,YI)
4%
5% OUTPUT:
6% VarVal: array giving the values of the calculated field
7% ListVarName: corresponding list of variable names
8% VarAttribute: corresponding list of variable attributes, each term #ilist is of the form VarAttribute{ilist}.tag=value
9%
10% INPUT:
11% Coord(nbpoints,2): matrix of x,y coordinates of the input data points
12% Data: inputfield structure
13% FieldName: string representing the field to calculate, or cell array of fields (as displayed in uvmat/FieldName)
14% XI, YI: set of x and y coordinates where the fields need to be linearly interpolated,
15%        if XI, YI are missing, there is no interpolation (case of colors in vector plots)
16%
17function [VarVal,ListVarName,VarAttribute,errormsg]=calc_field_interp(Coord,Data,FieldName,XI,YI)
18
19%% initialization
20VarVal={};
21ListVarName={};
22VarAttribute={};
23errormsg='';
24InputVarList={};
25if ischar(FieldName),FieldName={FieldName};end
26check_skipped=zeros(size(FieldName));% default, =1 to mark the variables which can be calculated
27check_interp=ones(size(FieldName));% default, =1 to mark the variables which can be interpolated (not ancillary)
28Operator=cell(size(FieldName));
29
30%% analyse the list of input fields: needed variables and requested operations
31for ilist=1:numel(FieldName)
32    Operator{ilist}='';%default empty operator (vec, norm,...)
33    r=regexp(FieldName{ilist},'(?<Operator>(^vec|^norm|^curl|^div|^strain))\((?<UName>.+),(?<VName>.+)\)$','names');% analyse the field name
34    if isempty(r) % the field name is a variable itself
35        ivar=find(strcmp(FieldName{ilist},Data.ListVarName));
36        if isempty(ivar)
37            check_skipped(ilist)=1; %variable not found
38        elseif isempty(find(strcmp(FieldName{ilist},InputVarList), 1));
39            if isfield(Data.VarAttribute{ivar},'Role') &&...
40                (strcmp(Data.VarAttribute{ivar}.Role,'ancillary')||strcmp(Data.VarAttribute{ivar}.Role,'warnflag')||strcmp(Data.VarAttribute{ivar}.Role,'errorflag'))
41                check_interp(ilist)=0; % ancillary variable, not interpolated     
42            end
43            InputVarList=[InputVarList FieldName{ilist}];% the variable is added to the list of input variables if it is not already in the list
44        end
45    else
46        if ~isfield(Data,r.UName)||~isfield(Data,r.VName)%needed input variable not found
47            check_skipped(ilist)=1;
48        elseif strcmp(r.Operator,'curl')||strcmp(r.Operator,'div')||strcmp(r.Operator,'strain')
49            Operator{ilist}=r.Operator;
50            switch r.Operator
51                case 'curl'% case of CivX data format
52                    UName{ilist}='vort';
53                    Data.vort=Data.DjUi(:,1,2)-Data.DjUi(:,2,1);
54                case 'div'
55                    UName{ilist}='div';
56                    Data.div=Data.DjUi(:,1,1)+Data.DjUi(:,2,2);
57                case 'strain'
58                    UName{ilist}='strain';
59                    Data.strain=Data.DjUi(:,1,2)+Data.DjUi(:,2,1);
60            end
61            InputVarList=[InputVarList UName{ilist}]; %the variable is added to the list if it is not already in the list
62        else
63            UName{ilist}=r.UName;
64            VName{ilist}=r.VName;
65            if isempty(find(strcmp(r.UName,InputVarList)));
66                InputVarList=[InputVarList UName{ilist}]; %the variable is added to the list if it is not already in the list
67            end
68            if isempty(find(strcmp(r.VName,InputVarList), 1));
69                InputVarList=[InputVarList VName{ilist}]; %the variable is added to the list if it is not already in the list
70            end
71            Operator{ilist}=r.Operator;
72        end
73    end
74end
75
76%% create interpolator for each variable to interpolate
77if exist('XI','var')
78    for ilist=1:numel(InputVarList)
79        F.(InputVarList{ilist})=TriScatteredInterp(Coord,Data.(InputVarList{ilist}),'linear');
80    end
81end
82
83%% perform the linear interpolation for the requested variables
84for ilist=1:numel(FieldName)
85    if ~check_skipped(ilist)
86        nbvar=numel(ListVarName);
87        switch Operator{ilist}
88            case 'vec'
89                if exist('XI','var')
90                    if check_interp
91                    VarVal{nbvar+1}=F.(UName{ilist})(XI,YI);
92                    VarVal{nbvar+2}=F.(VName{ilist})(XI,YI);
93                    end
94                else
95                    VarVal{nbvar+1}=Data.(UName{ilist});
96                    VarVal{nbvar+2}=Data.(VName{ilist});
97                end
98                ListVarName{nbvar+1}=UName{ilist};
99                ListVarName{nbvar+2}=VName{ilist};
100                VarAttribute{nbvar+1}.Role='vector_x';
101                VarAttribute{nbvar+2}.Role='vector_y';
102            case 'norm'
103                if exist('XI','var')
104                    if check_interp
105                    U2=F.(UName{ilist})(XI,YI).*F.(UName{ilist})(XI,YI);
106                    V2=F.(VName{ilist})(XI,YI).*F.(VName{ilist})(XI,YI);
107                    end
108                else
109                    U2=Data.(UName{ilist}).*Data.(UName{ilist});
110                    V2=Data.(VName{ilist}).*Data.(VName{ilist});
111                end
112                VarVal{nbvar+1}=sqrt(U2+V2);
113                ListVarName{nbvar+1}='norm';
114                VarAttribute{nbvar+1}.Role='scalar';
115            case {'curl','div','strain'}
116                if exist('XI','var')
117                    if check_interp
118                    VarVal{nbvar+1}=F.(UName{ilist})(XI,YI);
119                    end
120                else
121                    VarVal{nbvar+1}=Data.(UName{ilist});
122                end
123                ListVarName{nbvar+1}=UName{ilist};
124                VarAttribute{nbvar+1}.Role='scalar';
125            otherwise
126                if ~isempty(FieldName{ilist})
127                    if exist('XI','var')
128                        if check_interp
129                        VarVal{nbvar+1}=F.(FieldName{ilist})(XI,YI);
130                        end
131                    else
132                        VarVal{nbvar+1}= Data.(FieldName{ilist});
133                    end
134                    ListVarName{nbvar+1}=FieldName{ilist};
135                    VarAttribute{nbvar+1}.Role='scalar';
136                end
137        end
138    end
139end
140
141%% put an error flag to indicate NaN data
142if exist('XI','var')&&~isempty(VarVal)
143    nbvar=numel(ListVarName);
144    ListVarName{nbvar+1}='FF';
145    VarVal{nbvar+1}=isnan(VarVal{nbvar});
146    VarAttribute{nbvar+1}.Role='errorflag';
147end
148
149
150
151
152
Note: See TracBrowser for help on using the repository browser.