source: trunk/src/sub_field.m @ 863

Last change on this file since 863 was 862, checked in by sommeria, 9 years ago

bugs repaired

File size: 9.1 KB
RevLine 
[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%
[811]11% OUTPUT:
[8]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
[809]18%=======================================================================
19% Copyright 2008-2014, LEGI UMR 5519 / CNRS UJF G-INP, Grenoble, France
20%   http://www.legi.grenoble-inp.fr
21%   Joel.Sommeria - Joel.Sommeria (A) legi.cnrs.fr
22%
23%     This file is part of the toolbox UVMAT.
24%
25%     UVMAT is free software; you can redistribute it and/or modify
26%     it under the terms of the GNU General Public License as published
27%     by the Free Software Foundation; either version 2 of the license,
28%     or (at your option) any later version.
29%
30%     UVMAT is distributed in the hope that it will be useful,
31%     but WITHOUT ANY WARRANTY; without even the implied warranty of
32%     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
33%     GNU General Public License (see LICENSE.txt) for more details.
34%=======================================================================
35
[515]36function SubData=sub_field(Field,XmlData,Field_1)
[405]37
[515]38SubData=[];
39if strcmp(Field,'*')
40    return
41end
42if nargin<3
43    SubData=Field;
44    return
45end
[674]46
[405]47%% global attributes
[515]48SubData.ListGlobalAttribute={};%default
49%transfer global attributes of Field
[8]50if isfield(Field,'ListGlobalAttribute')
51    SubData.ListGlobalAttribute=Field.ListGlobalAttribute;
52    for ilist=1:numel(Field.ListGlobalAttribute)
53        AttrName=Field.ListGlobalAttribute{ilist};
[405]54        SubData.(AttrName)=Field.(AttrName);
[8]55    end
56end
[515]57%transfer global attributes of Field_1
[8]58if isfield(Field_1,'ListGlobalAttribute')
59    for ilist=1:numel(Field_1.ListGlobalAttribute)
60        AttrName=Field_1.ListGlobalAttribute{ilist};
[515]61        AttrNameNew=AttrName;
62        while ~isempty(find(strcmp(AttrNameNew,SubData.ListGlobalAttribute)))&&~isequal(Field_1.(AttrNameNew),Field.(AttrNameNew))
63            AttrNameNew=[AttrNameNew '_1'];
[8]64        end
[515]65        if ~isfield(Field,AttrName) || ~isequal(Field_1.(AttrName),Field.(AttrName))
[548]66            SubData.ListGlobalAttribute=[SubData.ListGlobalAttribute {AttrNameNew}];
67            SubData.(AttrNameNew)=Field_1.(AttrName);
[8]68        end
69    end
70end
[405]71
72%% variables
[515]73%reproduce variables of the first field and list its dimensions
[8]74SubData.ListVarName=Field.ListVarName;
75SubData.VarDimName=Field.VarDimName;
76if isfield(Field,'VarAttribute')
77    SubData.VarAttribute=Field.VarAttribute;
78end
[515]79ListDimName={};
80for ilist=1:numel(Field.ListVarName)
81    VarName=Field.ListVarName{ilist};
82    SubData.(VarName)=Field.(VarName);
83    SubData.VarAttribute{ilist}.CheckSub=0;
84    DimCell=Field.VarDimName{ilist};
85    if ischar(DimCell)
86        DimCell={DimCell};
87    end
88    for idim=1:numel(DimCell)
89        if isempty(find(strcmp(DimCell{idim},ListDimName)))
90            ListDimName=[ListDimName DimCell(idim)];
91        end
92    end
[8]93end
94
[515]95%% field request
[581]96ProjModeRequest=cell(size(Field.ListVarName));
[515]97for ilist=1:numel(Field.VarAttribute)
[581]98    if isfield(Field.VarAttribute{ilist},'ProjModeRequest')
99        ProjModeRequest{ilist}=Field.VarAttribute{ilist}.ProjModeRequest;
[402]100    end
101end
[581]102ProjModeRequest_1=cell(size(Field_1.ListVarName));
[515]103for ilist=1:numel(Field_1.VarAttribute)
[581]104    if isfield(Field_1.VarAttribute{ilist},'ProjModeRequest')
105        ProjModeRequest_1{ilist}=Field_1.VarAttribute{ilist}.ProjModeRequest;
[402]106    end
107end
[8]108
[515]109%% rename the dimensions of the second field if identical to those of the first
110for ilist=1:numel(Field_1.VarDimName)
111    DimCell=Field_1.VarDimName{ilist};
112    if ischar(DimCell)
113        DimCell={DimCell};
114    end
115    for idim=1:numel(DimCell)
116        ind_dim=find(strcmp(DimCell{idim},ListDimName));
117        if ~isempty(ind_dim)
118            if ischar(Field_1.VarDimName{ilist})
119                Field_1.VarDimName{ilist}=Field_1.VarDimName(ilist);
120            end
121            Field_1.VarDimName{ilist}{idim}=[ListDimName{ind_dim} '_1'];
122        end
123    end
[8]124end
125
[580]126%% look for coordinates common to Field in Field_1
[515]127ind_remove=zeros(size(Field_1.ListVarName));
[674]128% loop on the variables of the second field Field_1
[515]129for ilist=1:numel(Field_1.ListVarName)
[674]130    % case of variable with a single dimension
131    OldDimName=Field_1.VarDimName{ilist};
132    if ischar(OldDimName), OldDimName={OldDimName}; end% transform char string to cell if relevant
133    if numel(OldDimName)==1
134        OldDim=Field_1.(Field_1.ListVarName{ilist});% get variable
135        %look for the existence of the variable OldDim in the first field Field
[515]136        for i1=1:numel(Field.ListVarName)
[674]137            if  isequal(Field.(Field.ListVarName{i1}),OldDim) &&...
138                   ((isempty(ProjModeRequest{i1}) && isempty(ProjModeRequest_1{ilist}))  || strcmp(ProjModeRequest{i1},ProjModeRequest_1{ilist}))               
[515]139               ind_remove(ilist)=1;
[674]140               NewDimName=Field.VarDimName{i1};
141               if ischar(NewDimName), NewDimName={NewDimName}; end %transform char chain to cell if needed
142               Field_1.VarDimName=regexprep_r(Field_1.VarDimName,['^' OldDimName{1} '$'],NewDimName{1});% change the var name of Field_1 to the corresponding var name of Field
[180]143            end
144        end
[8]145    end
146end
[674]147Field_1.ListVarName(find(ind_remove))=[];%removes the redondent coordinate
[515]148Field_1.VarDimName(find(ind_remove))=[];
149Field_1.VarAttribute(find(ind_remove))=[];
[8]150
[580]151%% append the other variables of the second field, modifying their name if needed
[862]152ListVarNameNew=Field_1.ListVarName;
153check_rename=zeros(size(ListVarNameNew));
154for ilist=1:numel(ListVarNameNew)
[515]155    VarName=Field_1.ListVarName{ilist};
[862]156    ind_prev=find(strcmp(ListVarNameNew{ilist},Field.ListVarName),1);% look for duplicated variable name
157    if ~isempty(ind_prev)% variable name exists in Field
158        check_rename(ilist)=1;
159        ListVarNameNew{ilist}=[ListVarNameNew{ilist} '_1'];
[8]160    end
[862]161    SubData.ListVarName=[SubData.ListVarName ListVarNameNew{ilist}];
162    SubData.VarDimName=[SubData.VarDimName Field_1.VarDimName(ilist)];
163    SubData.(ListVarNameNew{ilist})=Field_1.(VarName);% teke the values of the old variable for the newly named one
164    %SubData.VarAttribute=[SubData.VarAttribute Field_1.VarDimName(ilist)];
[515]165end
166
[862]167%% replace variable name in field expression FieldName, e.g. 'norm(U,V)'-> 'norm(U_1,V_1)'
168for ilist=1:numel(ListVarNameNew)
169    if check_rename(ilist)&&  isfield(Field_1.VarAttribute{ilist},'FieldName')
170        for ivar=1:numel(find(check_rename))
171            Field_1.VarAttribute{ilist}.FieldName=regexprep_r(Field_1.VarAttribute{ilist}.FieldName,...
172                Field_1.ListVarName{ivar},ListVarNameNew{ivar});
173        end
174    end
175    SubData.VarAttribute=[SubData.VarAttribute Field_1.VarAttribute(ilist)];
176    SubData.VarAttribute{end}.CheckSub=1;% mark that the field needs to be substracted as an attribute
177end
178
[515]179%% substrat fields when possible
[580]180[CellInfo,NbDim,errormsg]=find_field_cells(SubData);
[515]181ind_remove=zeros(size(SubData.ListVarName));
182ivar=[];
183ivar_1=[];
[548]184for icell=1:numel(CellInfo)
185    if ~isempty(CellInfo{icell})
186        if isfield(CellInfo{icell},'VarIndex_scalar') && numel(CellInfo{icell}.VarIndex_scalar)==2 && SubData.VarAttribute{CellInfo{icell}.VarIndex_scalar(2)}.CheckSub;
187            ivar=[ivar CellInfo{icell}.VarIndex_scalar(1)];
188            ivar_1=[ivar_1 CellInfo{icell}.VarIndex_scalar(2)];
[8]189        end
[548]190        if isfield(CellInfo{icell},'VarIndex_vector_x') && numel(CellInfo{icell}.VarIndex_vector_x)==2 && SubData.VarAttribute{CellInfo{icell}.VarIndex_vector_x(2)}.CheckSub;
191            ivar=[ivar CellInfo{icell}.VarIndex_vector_x(1)];
192            ivar_1=[ivar_1 CellInfo{icell}.VarIndex_vector_x(2)];
[515]193        end
[548]194        if isfield(CellInfo{icell},'VarIndex_vector_y') && numel(CellInfo{icell}.VarIndex_vector_y)==2 && SubData.VarAttribute{CellInfo{icell}.VarIndex_vector_y(2)}.CheckSub;
195            ivar=[ivar CellInfo{icell}.VarIndex_vector_y(1)];
196            ivar_1=[ivar_1 CellInfo{icell}.VarIndex_vector_y(2)];
[515]197        end
[8]198    end
199end
[515]200for imod=1:numel(ivar)
201        VarName=SubData.ListVarName{ivar(imod)};
202        VarName_1=SubData.ListVarName{ivar_1(imod)};
[548]203        SubData.(VarName)=double(SubData.(VarName))-double(SubData.(VarName_1));
[515]204        ind_remove(ivar_1(imod))=1;
205end
206SubData.ListVarName(find(ind_remove))=[];
207SubData.VarDimName(find(ind_remove))=[];
208SubData.VarAttribute(find(ind_remove))=[];
[520]209
[580]210function OutputCell=regexprep_r(InputCell,search_string,new_string)
[713]211if ischar(InputCell); InputCell={InputCell}; end
[674]212OutputCell=InputCell;%default
[520]213for icell=1:numel(InputCell)
[580]214    OutputCell{icell}=regexprep(InputCell{icell},search_string,new_string);
[520]215end
[515]216       
217   
Note: See TracBrowser for help on using the repository browser.