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