function [error] = writeTSGDataNetCDF( hTsgGUI, filename) % Function to write TSG data in NetCDF file. % % Input % ----- % hTsgGUI ............ Handel to the main user interface % filename ........... Data filename % % Output % ------ % error ............. 1 : OK % ............. -1 : an error occured % % The data are store using setappdata - Variable name : 'tsg_data' % % Caution : replace the fill-value with NaN % % $Id$ %% Open the file % ------------- nc = netcdf(filename, 'clobber'); if isempty(nc) msg_error = ['TSG_GOSUD file_lecture : Open file error : ' filename]; warndlg( msg_error, 'NetCDF write dialog'); error = -1; return; end % Display read file info on console % --------------------------------- fprintf('\nWRITE_NETCDF_FILE\n'); tic; % Initialize loading NetCDF file waitbar % -------------------------------------- wb = waitbar(0, 'Initializing NetCDF file. Please wait...'); % We cannot change title property to 'none' (default set as 'tex') inside % waitbar function (line 81), see % http://www.mathworks.co.uk/matlabcentral/newsreader/view_thread/115725 % ----------------------------------------------------------------------- hchild = get(wb,'children'); htitle = get(hchild,'title'); set(htitle,'Interpreter','None'); % Get the data from the application GUI % ------------------------------------- tsg = getappdata( hTsgGUI, 'tsg_data'); % Get global attributes list from class tsg_nc with file 'tsg_ncattr.csv' % ----------------------------------------------------------------------- nca = tsg_nc('tsg_ncattr.csv'); nca_keys = keys(nca); % Get GF3 variables list codes from class tsg_nc with file 'tsg_ncvar.csv' % ----------------------------------------------------------------------- ncv = tsg_nc('tsg_test.csv'); ncv_keys = keys(ncv); ncv_fieldNames = get_fieldnames(ncv); % Display more info about write file on console % --------------------------------------------- fprintf('...writing %s : ', filename); %% Create NetCDF file: % ------------------- % Variable dimensions % ------------------- nc('DAYD') = numel(tsg.DAYD); nc('DAYD_WS') = numel(tsg.DAYD_WS); % number of water samples nc('DAYD_EXT') = numel(tsg.DAYD_EXT); % number of external SSPS or SSTP comparison nc('NCOEF_CAL') = 5; % number of calibration coefficients nc('NCOEF_LIN') = 2; % number of linearisation coefficients % Fixed dimensions % ---------------- nc('STRING256') = 256; nc('STRING14') = 14; nc('STRING4') = 4; nc('N1') = 1; % display filename after 'Interpreter','None' initialization to prevent % display console warning % --------------------------------------------------------------------- waitbar(1/50,wb,['Writing file: ' filename ' Please wait...']); %% Create NetCDF global attributes % ------------------------------- for i=1:numel(nca_keys) global_att = nca_keys{i}; nc.(global_att) = tsg.(global_att); end % Create NetCDF variables and attributes % -------------------------------------- for i=1:numel(ncv_keys) for j=1:numel(ncv_fieldNames) variable = ncv_keys{i}; fieldName = ncv_fieldNames{j}; value = get(ncv, variable, fieldName); % define dimension % ---------------- if strcmp(fieldName,'dimension') s = ['nc{''' variable '''} = {''' value '''}']; eval(s); % define variable attributes % -------------------------- elseif ~isempty(value) if ischar(value) nc{variable}.(fieldName) = ncchar(value); else nc{variable}.(fieldName) = ncfloat(value); end end end end %% Create data to NetCDF file: % --------------------------- % Write global attributes % ----------------------- for i=1:numel(nca_keys) % get netcdf global attribute name % -------------------------------- global_attr = nca_keys{i}; nc.(global_attr) = tsg.(global_attr); end % Convert Matlab julian days (datenum) to 1950 reference % ------------------------------------------------------ d = strmatch('DAYD',ncv_keys); for i=1:numel(d) tsg.(ncv_keys{d(i)}) = datenumToJulian(tsg.(ncv_keys{d(i)})); end % Write measurements (variables) % ------------------------------- for i=1:numel(ncv_keys) % get netcdf variable name % ------------------------ variable = ncv_keys{i}; % display waitbar % --------------- waitbar( i/numel(ncv_keys), wb, ['writing ' variable ' variable']); % DATE as two dimension % don't work under windows % nc{variable}(:) = tsg.(variable); if strmatch('DATE', variable) nc{variable}(:,:) = tsg.(variable); else % other one dimension % under Linux, when you write an with empty matrix to an unlimited % variable dimension, nc was corrupted to double object % works well on windows if ~isempty(tsg.(variable)) %nc{variable}(1:length(tsg.(variable))) = tsg.(variable); nc{variable}(:) = tsg.(variable); end end end % Close waitbar % ------------- close(wb) % Close NetCDF file % ----------------- endef(nc) close(nc) % Display time to write file on console % ------------------------------------- t = toc; fprintf('...done (%6.2f sec).\n\n',t); % Everything OK % ------------- error = 1; end