[179] | 1 | %'sub_field': combines two input fields
|
---|
| 2 | %
|
---|
| 3 | % the two fields are subtstracted when of the same nature (scalar or
|
---|
| 4 | % vector), if the coordinates do not coincide, the second field is
|
---|
| 5 | % interpolated on the cooridintes of the first one
|
---|
| 6 | %
|
---|
| 7 | % when scalar and vectors are combined, the fields are just merged in a single matlab structure for common visualisation
|
---|
[8] | 8 | %-----------------------------------------------------------------------
|
---|
[515] | 9 | % function SubData=sub_field(Field,XmlData,Field_1)
|
---|
[8] | 10 | %
|
---|
| 11 | % OUPUT:
|
---|
| 12 | % SubData: structure representing the resulting field
|
---|
| 13 | %
|
---|
| 14 | % INPUT:
|
---|
[179] | 15 | % Field: matlab structure representing the first field
|
---|
| 16 | % Field_1:matlab structure representing the second field
|
---|
[8] | 17 |
|
---|
[515] | 18 | function SubData=sub_field(Field,XmlData,Field_1)
|
---|
[405] | 19 |
|
---|
[515] | 20 | SubData=[];
|
---|
| 21 | if strcmp(Field,'*')
|
---|
| 22 | return
|
---|
| 23 | end
|
---|
| 24 | if nargin<3
|
---|
| 25 | SubData=Field;
|
---|
| 26 | return
|
---|
| 27 | end
|
---|
[405] | 28 | %% global attributes
|
---|
[515] | 29 | SubData.ListGlobalAttribute={};%default
|
---|
| 30 | %transfer global attributes of Field
|
---|
[8] | 31 | if isfield(Field,'ListGlobalAttribute')
|
---|
| 32 | SubData.ListGlobalAttribute=Field.ListGlobalAttribute;
|
---|
| 33 | for ilist=1:numel(Field.ListGlobalAttribute)
|
---|
| 34 | AttrName=Field.ListGlobalAttribute{ilist};
|
---|
[405] | 35 | SubData.(AttrName)=Field.(AttrName);
|
---|
[8] | 36 | end
|
---|
| 37 | end
|
---|
[515] | 38 | %transfer global attributes of Field_1
|
---|
[8] | 39 | if isfield(Field_1,'ListGlobalAttribute')
|
---|
| 40 | for ilist=1:numel(Field_1.ListGlobalAttribute)
|
---|
| 41 | AttrName=Field_1.ListGlobalAttribute{ilist};
|
---|
[515] | 42 | AttrNameNew=AttrName;
|
---|
| 43 | while ~isempty(find(strcmp(AttrNameNew,SubData.ListGlobalAttribute)))&&~isequal(Field_1.(AttrNameNew),Field.(AttrNameNew))
|
---|
| 44 | AttrNameNew=[AttrNameNew '_1'];
|
---|
[8] | 45 | end
|
---|
[515] | 46 | if ~isfield(Field,AttrName) || ~isequal(Field_1.(AttrName),Field.(AttrName))
|
---|
| 47 | SubData.ListGlobalAttribute=[SubData.ListGlobalAttribute {AttrNameNew}];
|
---|
| 48 | SubData.(AttrNameNew)=Field_1.(AttrName);
|
---|
[8] | 49 | end
|
---|
| 50 | end
|
---|
| 51 | end
|
---|
[405] | 52 |
|
---|
| 53 | %% variables
|
---|
[515] | 54 | %reproduce variables of the first field and list its dimensions
|
---|
[8] | 55 | SubData.ListVarName=Field.ListVarName;
|
---|
| 56 | SubData.VarDimName=Field.VarDimName;
|
---|
| 57 | if isfield(Field,'VarAttribute')
|
---|
| 58 | SubData.VarAttribute=Field.VarAttribute;
|
---|
| 59 | end
|
---|
[515] | 60 | ListDimName={};
|
---|
| 61 | for ilist=1:numel(Field.ListVarName)
|
---|
| 62 | VarName=Field.ListVarName{ilist};
|
---|
| 63 | SubData.(VarName)=Field.(VarName);
|
---|
| 64 | SubData.VarAttribute{ilist}.CheckSub=0;
|
---|
| 65 | DimCell=Field.VarDimName{ilist};
|
---|
| 66 | if ischar(DimCell)
|
---|
| 67 | DimCell={DimCell};
|
---|
| 68 | end
|
---|
| 69 | for idim=1:numel(DimCell)
|
---|
| 70 | if isempty(find(strcmp(DimCell{idim},ListDimName)))
|
---|
| 71 | ListDimName=[ListDimName DimCell(idim)];
|
---|
| 72 | end
|
---|
| 73 | end
|
---|
[8] | 74 | end
|
---|
| 75 |
|
---|
[515] | 76 | %% field request
|
---|
| 77 | FieldRequest=cell(size(Field.ListVarName));
|
---|
| 78 | for ilist=1:numel(Field.VarAttribute)
|
---|
| 79 | if isfield(Field.VarAttribute{ilist},'FieldRequest')
|
---|
| 80 | FieldRequest{ilist}=Field.VarAttribute{ilist}.FieldRequest;
|
---|
[402] | 81 | end
|
---|
| 82 | end
|
---|
[515] | 83 | FieldRequest_1=cell(size(Field_1.ListVarName));
|
---|
| 84 | for ilist=1:numel(Field_1.VarAttribute)
|
---|
| 85 | if isfield(Field_1.VarAttribute{ilist},'FieldRequest')
|
---|
| 86 | FieldRequest_1{ilist}=Field_1.VarAttribute{ilist}.FieldRequest;
|
---|
[402] | 87 | end
|
---|
| 88 | end
|
---|
[8] | 89 |
|
---|
[515] | 90 | %% rename the dimensions of the second field if identical to those of the first
|
---|
| 91 | for ilist=1:numel(Field_1.VarDimName)
|
---|
| 92 | DimCell=Field_1.VarDimName{ilist};
|
---|
| 93 | if ischar(DimCell)
|
---|
| 94 | DimCell={DimCell};
|
---|
| 95 | end
|
---|
| 96 | for idim=1:numel(DimCell)
|
---|
| 97 | ind_dim=find(strcmp(DimCell{idim},ListDimName));
|
---|
| 98 | if ~isempty(ind_dim)
|
---|
| 99 | if ischar(Field_1.VarDimName{ilist})
|
---|
| 100 | Field_1.VarDimName{ilist}=Field_1.VarDimName(ilist);
|
---|
| 101 | end
|
---|
| 102 | Field_1.VarDimName{ilist}{idim}=[ListDimName{ind_dim} '_1'];
|
---|
| 103 | end
|
---|
| 104 | end
|
---|
[8] | 105 | end
|
---|
| 106 |
|
---|
[515] | 107 | %look for coordinates common to Field in Field_1
|
---|
| 108 | ind_remove=zeros(size(Field_1.ListVarName));
|
---|
| 109 | for ilist=1:numel(Field_1.ListVarName)
|
---|
| 110 | if ischar(Field_1.VarDimName{ilist})||numel(Field_1.VarDimName{ilist})==1
|
---|
| 111 | OldDim=Field_1.VarDimName{ilist};
|
---|
| 112 | if ischar(OldDim)
|
---|
| 113 | OldDim=Field_1.VarDimName(ilist);
|
---|
[8] | 114 | end
|
---|
[515] | 115 | VarVal=Field_1.(Field_1.ListVarName{ilist});
|
---|
| 116 | for i1=1:numel(Field.ListVarName)
|
---|
| 117 | if (isempty(FieldRequest{i1})&&isempty(FieldRequest_1{ilist})||strcmp(FieldRequest{i1},FieldRequest_1{ilist})) && isequal(Field.(Field.ListVarName{i1}),VarVal)
|
---|
| 118 | ind_remove(ilist)=1;
|
---|
| 119 | NewDim=Field.VarDimName{i1};
|
---|
| 120 | if ischar(NewDim)
|
---|
| 121 | NewDim={NewDim};
|
---|
| 122 | end
|
---|
| 123 | Field_1.VarDimName=regexprep_r(Field_1.VarDimName,OldDim{1},NewDim{1});
|
---|
[180] | 124 | end
|
---|
| 125 | end
|
---|
[8] | 126 | end
|
---|
| 127 | end
|
---|
[515] | 128 | Field_1.ListVarName(find(ind_remove))=[];%removes these redondent coordinates
|
---|
| 129 | Field_1.VarDimName(find(ind_remove))=[];
|
---|
| 130 | Field_1.VarAttribute(find(ind_remove))=[];
|
---|
[8] | 131 |
|
---|
[515] | 132 | %append the other variables of the second field, modifying their name if needed
|
---|
| 133 | for ilist=1:numel(Field_1.ListVarName)
|
---|
| 134 | VarName=Field_1.ListVarName{ilist};
|
---|
| 135 | ind_prev=find(strcmp(VarName,Field.ListVarName));
|
---|
| 136 | if isempty(ind_prev)% variable name does not exist in Field
|
---|
| 137 | VarNameNew=VarName;
|
---|
| 138 | else % variable name exists in Field
|
---|
| 139 | VarNameNew=[VarName '_1'];
|
---|
[8] | 140 | end
|
---|
[515] | 141 | SubData.ListVarName=[SubData.ListVarName {VarNameNew}];
|
---|
| 142 | SubData.VarDimName=[SubData.VarDimName Field_1.VarDimName(ilist)];
|
---|
| 143 | SubData.(VarNameNew)=Field_1.(VarName);
|
---|
| 144 | SubData.VarAttribute=[SubData.VarAttribute Field_1.VarAttribute(ilist)];
|
---|
| 145 | SubData.VarAttribute{end}.CheckSub=1;% mark that the field needs to be substracted
|
---|
| 146 | end
|
---|
| 147 |
|
---|
| 148 | %append the other variables of the second field, modifying their name if needed
|
---|
| 149 |
|
---|
| 150 | %% substrat fields when possible
|
---|
| 151 | [CellVarIndex,NbDim,CellVarType,errormsg]=find_field_cells(SubData);
|
---|
| 152 | ind_remove=zeros(size(SubData.ListVarName));
|
---|
| 153 | ivar=[];
|
---|
| 154 | ivar_1=[];
|
---|
| 155 | for icell=1:numel(CellVarIndex)
|
---|
| 156 | if ~isempty(CellVarIndex{icell})
|
---|
| 157 | if isfield(CellVarType{icell},'scalar') && numel(CellVarType{icell}.scalar)==2 && SubData.VarAttribute{CellVarType{icell}.scalar(2)}.CheckSub;
|
---|
| 158 | ivar=[ivar CellVarType{icell}.scalar(1)];
|
---|
| 159 | ivar_1=[ivar_1 CellVarType{icell}.scalar(2)];
|
---|
[8] | 160 | end
|
---|
[515] | 161 | if isfield(CellVarType{icell},'vector_x') && numel(CellVarType{icell}.vector_x)==2 && SubData.VarAttribute{CellVarType{icell}.vector_x(2)}.CheckSub;
|
---|
| 162 | ivar=[ivar CellVarType{icell}.vector_x(1)];
|
---|
| 163 | ivar_1=[ivar_1 CellVarType{icell}.vector_x(2)];
|
---|
| 164 | end
|
---|
| 165 | if isfield(CellVarType{icell},'vector_y') && numel(CellVarType{icell}.vector_y)==2 && SubData.VarAttribute{CellVarType{icell}.vector_y(2)}.CheckSub;
|
---|
| 166 | ivar=[ivar CellVarType{icell}.vector_y(1)];
|
---|
| 167 | ivar_1=[ivar_1 CellVarType{icell}.vector_y(2)];
|
---|
| 168 | end
|
---|
[8] | 169 | end
|
---|
| 170 | end
|
---|
[515] | 171 | for imod=1:numel(ivar)
|
---|
| 172 | VarName=SubData.ListVarName{ivar(imod)};
|
---|
| 173 | VarName_1=SubData.ListVarName{ivar_1(imod)};
|
---|
| 174 | SubData.(VarName)=SubData.(VarName)-SubData.(VarName_1);
|
---|
| 175 | ind_remove(ivar_1(imod))=1;
|
---|
| 176 | end
|
---|
| 177 | SubData.ListVarName(find(ind_remove))=[];
|
---|
| 178 | SubData.VarDimName(find(ind_remove))=[];
|
---|
| 179 | SubData.VarAttribute(find(ind_remove))=[];
|
---|
[520] | 180 |
|
---|
| 181 | function OutputCell=regexprep_r(InputCell,dimname,dimname_new)
|
---|
| 182 | for icell=1:numel(InputCell)
|
---|
| 183 | OutputCell{icell}=regexprep(InputCell{icell},['^' dimname '$'],dimname_new);
|
---|
| 184 | end
|
---|
[515] | 185 |
|
---|
| 186 |
|
---|