Index: ../trunk-jpl/src/m/classes/model/model.m =================================================================== --- ../trunk-jpl/src/m/classes/model/model.m (revision 14610) +++ ../trunk-jpl/src/m/classes/model/model.m (revision 14611) @@ -1138,7 +1138,7 @@ end % }}} function memory(obj) % {{{ - disp(sprintf('\nMemory imprint: ')); + disp(sprintf('\nMemory imprint:\n')); fields=properties('model'); mem=0; @@ -1147,7 +1147,7 @@ field=obj.(fields{i}); s=whos('field'); mem=mem+s.bytes/1e6; - disp(sprintf('%19s: %g Mb',fields{i},s.bytes/1e6)); + disp(sprintf('%19s: %6.2f Mb',fields{i},s.bytes/1e6)); end disp(sprintf('%19s--%10s','--------------','--------------')); disp(sprintf('%19s: %g Mb','Total',mem)); @@ -1165,67 +1165,19 @@ %1. Create NetCDF file ncid=netcdf.create(filename,'CLOBBER'); netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Conventions','CF-1.4'); - netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Title',['ISSM model' obj.miscellaneous.name]); + netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Title',['ISSM model (' obj.miscellaneous.name ')']); netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Author',getenv('USER')); netcdf.putAtt(ncid,netcdf.getConstant('NC_GLOBAL'),'Date',datestr(now)); - %2. prepare some simple dimensions + %Preallocate variable id, needed to write variables in netcdf file var_id=zeros(300,1);%preallocate - %2. First round: define variables (step=1), put variable (step=2) - fields1=properties('model'); - for step=1:2, counter=0; - for i=1:length(fields1), - fields2=fields(obj.(fields1{i})); - for j=1:length(fields2) - counter = counter+1; - fieldname = [fields1{i} '.' fields2{j}]; - field = obj.(fields1{i}).(fields2{j}); - if isa(field,'double') & numel(field)==1, - if step==1, - var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_DOUBLE',[]); - else - netcdf.putVar(ncid,var_id(counter),field); - end - elseif isa(field,'double') & size(field,2)==1, - if step==1, - dim_id = netcdf.defDim(ncid,[fieldname '_size1'],size(field,1)); - var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_DOUBLE',dim_id); - else - netcdf.putVar(ncid,var_id(counter),field); - end - elseif isa(field,'double') & size(field,2)>1, - if step==1, - dim1_id = netcdf.defDim(ncid,[fieldname '_size1'],size(field,1)); - dim2_id = netcdf.defDim(ncid,[fieldname '_size2'],size(field,2)); - var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_DOUBLE',[dim2_id dim1_id]); - else - netcdf.putVar(ncid,var_id(counter),transpose(field)); - end - elseif isa(field,'char') & ~isempty(field), - if step==1, - dim_id = netcdf.defDim(ncid,[fieldname '_size1'],numel(field)); - var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_CHAR',dim_id); - else - netcdf.putVar(ncid,var_id(counter),transpose(field)); - end - elseif isa(field,'logical') & numel(field)==1, - if step==1, - var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_BYTE',[]); - else - netcdf.putVar(ncid,var_id(counter),int8(field)); - end - else - disp(['skipping ' fieldname '...']); - end - end - - end - + var_id=structtonc(ncid,'md',obj,0,var_id,counter,step); if step==1, netcdf.endDef(ncid); end end + if counter>300, warning('preallocation of var_id need to be updated'); end Index: ../trunk-jpl/src/m/io/structtonc.m =================================================================== --- ../trunk-jpl/src/m/io/structtonc.m (revision 0) +++ ../trunk-jpl/src/m/io/structtonc.m (revision 14611) @@ -0,0 +1,58 @@ +function [var_id,counter] = structtonc(ncid,fieldname,field,depth,var_id,counter,step); +%STRUCTTONC- fill nc file with structure fields +% +% WARNING: Do not use this function, this function is called +% by netcdf(model); +% + +%update counter +counter = counter+1; + +%Datatype dependent switch +if isa(field,'double') & numel(field)==1, + if step==1, + var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_DOUBLE',[]); + else + netcdf.putVar(ncid,var_id(counter),field); + end +elseif isa(field,'double') & size(field,2)==1, + if step==1, + dim_id = netcdf.defDim(ncid,[fieldname '_size1'],size(field,1)); + var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_DOUBLE',dim_id); + else + netcdf.putVar(ncid,var_id(counter),field); + end +elseif isa(field,'double') & size(field,2)>1, + if step==1, + dim1_id = netcdf.defDim(ncid,[fieldname '_size1'],size(field,1)); + dim2_id = netcdf.defDim(ncid,[fieldname '_size2'],size(field,2)); + var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_DOUBLE',[dim2_id dim1_id]); + else + netcdf.putVar(ncid,var_id(counter),transpose(field)); + end +elseif isa(field,'char') & ~isempty(field), + if step==1, + dim_id = netcdf.defDim(ncid,[fieldname '_size1'],numel(field)); + var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_CHAR',dim_id); + else + netcdf.putVar(ncid,var_id(counter),transpose(field)); + end +elseif isa(field,'logical') & numel(field)==1, + if step==1, + var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_BYTE',[]); + else + netcdf.putVar(ncid,var_id(counter),int8(field)); + end +elseif isa(field,'struct'), + subfields = fields(field); + for i=1:length(subfields), + [var_id,counter] = structtonc(ncid,[fieldname '.' subfields{i}],field.(subfields{i}),depth+1,var_id,counter,step); + end +elseif isobject(field), + subfields = fields(field); + for i=1:length(subfields), + [var_id,counter] = structtonc(ncid,[fieldname '.' subfields{i}],field.(subfields{i}),depth+1,var_id,counter,step); + end +else + disp(['skipping ' fieldname '...']); +end