Index: /issm/trunk-jpl/src/m/io/structtonc.m
===================================================================
--- /issm/trunk-jpl/src/m/io/structtonc.m	(revision 14638)
+++ /issm/trunk-jpl/src/m/io/structtonc.m	(revision 14639)
@@ -10,8 +10,11 @@
 
 %Check that field is not empty
-if isempty(field),
+if isempty(field) | (isa(field,'struct') & numel(fields(field))==0),
 	if(step==1), disp(['skipping ' fieldname ' (empty)...']); end
 	return;
 end
+
+%Write field class
+[var_id,counter] = declareclass(ncid,[fieldname '_class'],class(field),depth,var_id,counter,step);
 
 %Double scalar
@@ -48,5 +51,5 @@
 			var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_CHAR',dim_id);
 		else
-			netcdf.putVar(ncid,var_id(counter),transpose(field));
+			netcdf.putVar(ncid,var_id(counter),field);
 		end
 
@@ -61,15 +64,29 @@
 %Structures
 elseif isa(field,'struct'),
+	sublength = numel(field);
 	subfields = fields(field);
-	sublength = numel(field);
-	if sublength==1,
+	allsubfields = '';
+	for i=1:length(subfields),
+		allsubfields=[allsubfields subfields{i}];
+		if i~=length(subfields), allsubfields=[allsubfields ' ']; end
+	end
+	%Write size
+	if step==1,
+		var_id(counter) = netcdf.defVar(ncid,[fieldname '_length'],'NC_INT',[]);
+	else
+		netcdf.putVar(ncid,var_id(counter),sublength);
+	end
+	counter=counter+1;
+	%Write fields
+	if step==1,
+
+		dim_id          = netcdf.defDim(ncid,[fieldname '_fields_length'],numel(allsubfields));
+		var_id(counter) = netcdf.defVar(ncid,[fieldname '_fields'],'NC_CHAR',dim_id);
+	else
+		netcdf.putVar(ncid,var_id(counter),allsubfields);
+	end
+	for n=1:sublength,
 		for i=1:length(subfields),
-			[var_id,counter] = structtonc(ncid,[fieldname '.' subfields{i}],field.(subfields{i}),depth+1,var_id,counter,step);
-		end
-	else
-		for n=1:sublength,
-			for i=1:length(subfields),
-				[var_id,counter] = structtonc(ncid,[fieldname '.' subfields{i} '(' num2str(n) ')'],field(n).(subfields{i}),depth+1,var_id,counter,step);
-			end
+			[var_id,counter] = structtonc(ncid,[fieldname '.' subfields{i} '(' num2str(n) ')'],field(n).(subfields{i}),depth+1,var_id,counter,step);
 		end
 	end
@@ -77,5 +94,12 @@
 %Cell
 elseif isa(field,'cell'),
-	for i=1:length(field),
+	sublength = numel(field);
+	%Write size
+	if step==1,
+		var_id(counter) = netcdf.defVar(ncid,[fieldname '_length'],'NC_INT',[]);
+	else
+		netcdf.putVar(ncid,var_id(counter),sublength);
+	end
+	for i=1:sublength,
 		[var_id,counter] = structtonc(ncid,[fieldname '{' num2str(i) '}'],field{i},depth+1,var_id,counter,step);
 	end
@@ -83,6 +107,4 @@
 %Objects
 elseif isobject(field),
-	%First we need to keep track of the object class name
-	[var_id,counter] = structtonc(ncid,[fieldname '_class'],class(field),depth,var_id,counter,step);
 	subfields = fields(field);
 	for i=1:length(subfields),
@@ -92,2 +114,19 @@
 	disp(['skipping ' fieldname ' (format not supported)...']);
 end
+
+function [var_id,counter] = declareclass(ncid,fieldname,field,depth,var_id,counter,step);
+
+if isa(field,'char') 
+	if step==1,
+		dim_id          = netcdf.defDim(ncid,[fieldname '_length'],numel(field));
+		var_id(counter) = netcdf.defVar(ncid,fieldname,'NC_CHAR',dim_id);
+	else
+		netcdf.putVar(ncid,var_id(counter),field);
+	end
+else
+	error('class name is not a string');
+end
+
+%update counter
+counter   = counter+1;
+
