'nc2struct_toolbox': transform a netcdf file in a corresponding matlab structure, USE OLD NETCDF LIBRARY ---------------------------------------------------------------------- function [Data,var_detect,ichoice]=nc2struct_toolbox(nc,ListVarName) OUTPUT: Data: structure containing all the information of the netcdf file (or netcdf object) with fields: .ListGlobalAttribute: cell listing the names of the global attributes .Att_1,Att_2... : values of the global attributes .ListDimName: cell listing the names of the array dimensions .DimValue: array dimension values (Matlab vector with the same length as .ListDimName .ListVarName: cell listing the names of the variables .VarDimIndex: cell containing the set of dimension indices (in list .ListDimName) for each variable of .ListVarName .VarDimName: cell containing a cell of dimension names (in list .ListDimName) for each variable of .ListVarName .VarAttribute: cell of structures s containing names and values of variable attributes (s.name=value) for each variable of .ListVarName .Var1, .Var2....: variables (Matlab arrays) with names listed in .ListVarName var_detect: vector with same length as ListVarName, with 1 for each detected variable and 0 else. ichoice: = line INPUT: nc: name of a netcdf file (char string) or netcdf object ListVarName: optional list of variable names to select (cell array of char strings {'VarName1', 'VarName2',...} ) if ListVarName=[] or{}, no variables is read (only global attributes and lists of vdimensions, variables and attriburtes) if ListVarName is absent or ='*', ALL the variables are read. if ListVarName is a cell array with n lines, the set of variables will be sought by order of priority in the list, while output names will be set by the first line AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA Copyright Joel Sommeria, 2008, LEGI / CNRS-UJF-INPG, sommeria@coriolis-legi.org. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA This file is part of the toolbox UVMAT. UVMAT is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. UVMAT is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License (file UVMAT/COPYING.txt) for more details. AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
0001 %'nc2struct_toolbox': transform a netcdf file in a corresponding matlab structure, USE OLD NETCDF LIBRARY 0002 %---------------------------------------------------------------------- 0003 % function [Data,var_detect,ichoice]=nc2struct_toolbox(nc,ListVarName) 0004 % 0005 % OUTPUT: 0006 % Data: structure containing all the information of the netcdf file (or netcdf object) 0007 % with fields: 0008 % .ListGlobalAttribute: cell listing the names of the global attributes 0009 % .Att_1,Att_2... : values of the global attributes 0010 % .ListDimName: cell listing the names of the array dimensions 0011 % .DimValue: array dimension values (Matlab vector with the same length as .ListDimName 0012 % .ListVarName: cell listing the names of the variables 0013 % .VarDimIndex: cell containing the set of dimension indices (in list .ListDimName) for each variable of .ListVarName 0014 % .VarDimName: cell containing a cell of dimension names (in list .ListDimName) for each variable of .ListVarName 0015 % .VarAttribute: cell of structures s containing names and values of variable attributes (s.name=value) for each variable of .ListVarName 0016 % .Var1, .Var2....: variables (Matlab arrays) with names listed in .ListVarName 0017 % var_detect: vector with same length as ListVarName, with 1 for each detected variable and 0 else. 0018 % ichoice: = line 0019 % 0020 %INPUT: 0021 % nc: name of a netcdf file (char string) or netcdf object 0022 % ListVarName: optional list of variable names to select (cell array of char strings {'VarName1', 'VarName2',...} ) 0023 % if ListVarName=[] or{}, no variables is read (only global attributes and lists of vdimensions, variables and attriburtes) 0024 % if ListVarName is absent or ='*', ALL the variables are read. 0025 % if ListVarName is a cell array with n lines, the set of variables 0026 % will be sought by order of priority in the list, while output names will be set by the first line 0027 % 0028 %AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0029 % Copyright Joel Sommeria, 2008, LEGI / CNRS-UJF-INPG, sommeria@coriolis-legi.org. 0030 %AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0031 % This file is part of the toolbox UVMAT. 0032 % 0033 % UVMAT is free software; you can redistribute it and/or modify 0034 % it under the terms of the GNU General Public License as published by 0035 % the Free Software Foundation; either version 2 of the License, or 0036 % (at your option) any later version. 0037 % 0038 % UVMAT is distributed in the hope that it will be useful, 0039 % but WITHOUT ANY WARRANTY; without even the implied warranty of 0040 % MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 0041 % GNU General Public License (file UVMAT/COPYING.txt) for more details. 0042 %AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 0043 0044 function [Data,var_detect,ichoice]=nc2struct_toolbox(nc,ListVarName) 0045 0046 %default output 0047 Data=[]; 0048 % ListIndex=[]; 0049 var_detect=[]; 0050 ichoice=[];%default 0051 %open the netcdf file for reading 0052 if ischar(nc) 0053 if exist(nc,'file') 0054 nc=netcdf(nc,'nowrite'); 0055 testfile=1; 0056 else 0057 Data.Txt=['ERROR:file ' nc ' does not exist']; 0058 return 0059 end 0060 else 0061 testfile=0; 0062 end 0063 0064 % -------- read global attributes ----------- 0065 att_read=att(nc);%cell of 'global attributes' (nc objects) 0066 att_key={};%default 0067 iatt_g=0; 0068 for iatt=1:length(att_read) 0069 aa=att_read{iatt}; 0070 keystr=name(aa); 0071 indstr1=regexp(keystr,'\\');%replace dots' 0072 indstr2=regexp(keystr,'\.');%replace dots' 0073 if ~isequal(keystr,'title') % PROBLEM WITH civx files do not read 'title' 0074 if isempty(indstr1) && isempty(indstr2) % 0075 eval(['valuestr=nc.' keystr '(:);']) 0076 if ischar(valuestr) && length(valuestr)<200 0077 iatt_g=iatt_g+1; 0078 indstr1=regexp(keystr,'\\');%replace dots' 0079 indstr2=regexp(keystr,'\.');%replace dots' 0080 if isempty(indstr1) && isempty(indstr2) 0081 eval(['Data.' keystr '=''' valuestr ''';']) 0082 att_key{iatt_g}=keystr; 0083 end 0084 elseif isempty(valuestr) 0085 iatt_g=iatt_g+1; 0086 eval(['Data.' keystr '=[];']) 0087 att_key{iatt_g}=keystr; 0088 elseif isnumeric(valuestr) 0089 iatt_g=iatt_g+1; 0090 eval(['Data.' keystr '=valuestr;']) 0091 att_key{iatt_g}=keystr; 0092 end 0093 end 0094 end 0095 end 0096 Data.ListGlobalAttribute=att_key; 0097 nbattr=length(att_key); 0098 neworder=[nbattr+1 [1:nbattr]]; 0099 Data=orderfields(Data,neworder); 0100 0101 % -------- read dimensions ----------- 0102 dim_read=dim(nc);%cell of variable dimension names (nc objects) 0103 dim_name={}; 0104 dim_value=[]; 0105 for idim=1:length(dim_read); 0106 aa=dim_read{idim}; 0107 if ~isempty(aa) 0108 dim_name{idim}=name(aa); 0109 dim_value(idim)=length(aa); 0110 end 0111 end 0112 if ~isempty(dim_name) && ~isempty(dim_value) 0113 Data.ListDimName=dim_name; 0114 Data.DimValue=dim_value; 0115 used=zeros(1,length(dim_value));%initialize test of used dimensions 0116 end 0117 0118 % -------- read variables ----------- 0119 var_read={}; %default 0120 testmulti=0; 0121 OutputList=[]; 0122 if isequal(ListVarName,'*')|| isempty(ListVarName) 0123 var_read=var(nc);%cell of all variables 0124 elseif ~isempty(ListVarName) 0125 sizvar=size(ListVarName); 0126 testmulti=(sizvar(1)>1); 0127 if testmulti 0128 OutputList=ListVarName(1,:); 0129 testend=0; 0130 for iline=1:sizvar(1) 0131 if testend 0132 break 0133 end 0134 for ivar=1:sizvar(2) 0135 var_read{ivar}=[];%default 0136 var_detect(ivar)=0;%default 0137 VarName=ListVarName{iline,ivar}; 0138 if ~isempty(VarName) 0139 var_read{ivar}=nc{VarName};%select the input variable names 0140 if ivar==1 0141 if isempty (var_read{ivar}) 0142 break%go to next line if the first nc variable is not found 0143 else 0144 testend=1; %this line will be read 0145 ichoice=iline-1; %selectedline number in the list of input names of variables 0146 var_detect(ivar)=1; 0147 end 0148 else 0149 var_detect(ivar)=~isempty (var_read{ivar}); 0150 end 0151 end 0152 end 0153 end 0154 if ~isempty(find(var_detect)) 0155 OutputList=OutputList(find(var_detect)); 0156 end 0157 else %single list of input variables 0158 var_detect=ones(size(ListVarName)); 0159 for ivar=1:sizvar(2) 0160 var_read{ivar}=nc{ListVarName{ivar}};%select the input variable names 0161 var_detect(ivar)=~isempty(var_read{ivar}); 0162 end 0163 end 0164 var_read=var_read(find(var_detect)); 0165 end 0166 % var_dim_index=[]; %default 0167 Data.ListVarName={};%default 0168 for ivar=1:length(var_read) 0169 vv=var_read{ivar}; 0170 Data.ListVarName{ivar}=name(vv);%name of the variable 0171 if testmulti 0172 Data.ListVarName{ivar}=OutputList{ivar}; 0173 else 0174 Data.ListVarName{ivar}=name(vv);%name of the variable 0175 end 0176 var_dim=dim(vv);%dimension netcdf object of the variable 0177 for ivardim=1:length(var_dim) 0178 var_dim_name=name(var_dim{ivardim});%name of the dimension 0179 for idim=1:length(dim_name)% find the index of the current dimension in the list of dimensions 0180 if isequal(dim_name{idim},var_dim_name) 0181 Data.VarDimIndex{ivar}(ivardim)=idim; 0182 used(idim)=1; 0183 break 0184 end 0185 end 0186 end 0187 Data.VarDimName{ivar}={}; 0188 %variable attributes 0189 % if ivar==1 0190 Data.VarAttribute{ivar}=[];%initialisation of the list of variable attributes 0191 % end 0192 %variable attributes 0193 att_read=att(vv); 0194 for iatt=1:length(att_read) 0195 aa=att_read{iatt}; 0196 eval(['valuestr=vv.' name(aa) '(:);']) 0197 if ischar(valuestr) 0198 eval(['Data.VarAttribute{ivar}.' name(aa) '=''' valuestr ''';']) 0199 elseif isempty(valuestr) 0200 eval(['Data.VarAttribute{ivar}.' name(aa) '=[];']) 0201 elseif isnumeric(valuestr) 0202 eval(['Data.VarAttribute{ivar}.' name(aa) '=valuestr;']) 0203 end 0204 end 0205 end 0206 0207 %select the used dimensions 0208 if isempty(var_read) 0209 if isfield(Data,'ListDimName') && isfield(Data,'DimValue') 0210 Data=rmfield(Data,'ListDimName'); 0211 Data=rmfield(Data,'DimValue'); 0212 end 0213 else 0214 old_dim_index=find(used); %dimension indices which are used by the selected variables 0215 old2new=cumsum(used); 0216 Data.ListDimName=Data.ListDimName(old_dim_index); 0217 Data.DimValue=Data.DimValue(old_dim_index); 0218 end 0219 for ivar=1:length(var_read) 0220 Data.VarDimIndex{ivar}=(old2new(Data.VarDimIndex{ivar})); 0221 Data.VarDimName{ivar}=(Data.ListDimName(Data.VarDimIndex{ivar})); 0222 end 0223 %variable values 0224 0225 if ~isempty(ListVarName) 0226 for ivar=1:length(Data.ListVarName) 0227 vv=var_read{ivar}; 0228 vdata=vv(:);%data array of the field variable 0229 eval(['Data.' Data.ListVarName{ivar} '=vdata;'])%read the variable data 0230 end 0231 end 0232 % -------- close fle----------- 0233 if testfile==1 0234 close(nc) 0235 end 0236