Index: /issm/trunk-jpl/src/m/contrib/defleurian/netCDF/export_netCDF.m
===================================================================
--- /issm/trunk-jpl/src/m/contrib/defleurian/netCDF/export_netCDF.m	(revision 27263)
+++ /issm/trunk-jpl/src/m/contrib/defleurian/netCDF/export_netCDF.m	(revision 27264)
@@ -41,11 +41,18 @@
 	DimValue(2)=DimSize(2).value;
 	% adding mesh related dimensions
-	dimlist=[2,40,md.mesh.numberofelements,md.mesh.numberofvertices,size(md.mesh.elements,2)];
+	dimlist=[2 40 md.mesh.numberofelements md.mesh.numberofvertices size(md.mesh.elements,2)];
 	dimnames=["DictDummy" "StringLength" "EltNum" "VertNum" "VertPerElt"];
+	if isprop(md.mesh, 'edges'),
+		dimlist(end+1)=md.mesh.numberofedges;
+		dimnames(end+1)="EdgeNum";
+	else
+		dimlist(end+1)=0;
+		dimnames(end+1)="EdgeNum";
+	end
 	if verbose > 0,
 		disp('===Creating dimensions ===');
 	end
 	%define netcdf dimensions
-	for i=1:5
+	for i=1:length(dimlist)
 		% do not add the dimension if it exists already
 		if sum(dimlist(i) == DimValue) == 0
@@ -61,8 +68,12 @@
 
 	for cl=1:length(issmclasses),
-		subclasses=fieldnames(md.(issmclasses{cl}))';
-		for sc=1:length(subclasses),
-			if sum(strcmp(class(md.(issmclasses{cl}).(subclasses{sc})), typelist)) == 0,
-				issmclasses = [issmclasses class(md.(issmclasses{cl}).(subclasses{sc}))];
+		if isempty(md.(issmclasses{cl})),
+			disp(sprintf("md.%s is empty and will be left as default",issmclasses{cl}));
+		else
+			subclasses=fieldnames(md.(issmclasses{cl}))';
+			for sc=1:length(subclasses),
+				if sum(strcmp(class(md.(issmclasses{cl}).(subclasses{sc})), typelist)) == 0,
+					issmclasses = [issmclasses class(md.(issmclasses{cl}).(subclasses{sc}))];
+				end
 			end
 		end
@@ -83,4 +94,8 @@
 		groupID=netcdf.defGrp(ncid,groups{i});
 		%In each group gather the fields of the class
+		if isempty(md.(groups{i})),
+			disp(sprintf("WARNING: md.%s is empty, we skip it.",groups{i}))
+			continue
+		end
 		fields=fieldnames(md.(groups{i}));
 		if isempty(fields),
@@ -169,5 +184,5 @@
 			elseif isa(Var,'struct')  % structures need special treatment
 				if strcmp(groups{i}, 'results'),
-					klasstring='results.results';
+					klasstring=strcat(groups{i} ,'.', groups{i});
 					netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype',klasstring);
 					Listsize= length(md.(groups{i}).(fields{j}));
@@ -212,4 +227,16 @@
 						end
 					end
+				elseif strcmp(groups{i}, 'toolkits'),
+					klasstring=strcat(groups{i} ,'.', groups{i});
+					netcdf.putAtt(groupID,netcdf.getConstant('NC_GLOBAL'),'classtype',klasstring);
+					if verbose > 4,
+						disp(sprintf("=}{=creating var for %s.%s",groups{i}, fields{j}));
+					end
+
+					[DimSize,DimValue,varid]=CreateVar(ncid,Var,groupID,fields{j},DimSize,DimValue);
+					if ~isempty(varid),
+						FillVar(Var,groupID,varid);
+					end
+
 				elseif isempty(fieldnames(md.(groups{i}).(fields{j}))) % this is an empty struct, jus treat it as normal
 					klass=class(md.(groups{i}));
@@ -399,26 +426,27 @@
 	elseif isa(Var,'struct'),
 		%Start by getting the structure fields and size
-		locfields=fieldnames(Var)
+		locfields=fieldnames(Var);
 		for i=1:length(locfields),
 			for j=1:2,
 				if j==1,
-					CharVar=locfields{i};
+					CharVar=locfields{i}';
+					disp(size(CharVar))
 					if length(CharVar)==0
 						CharVar='emptystruct';
 					end
-					startpoint=[i-1,0,0];
+					startpoint=[0,0,i-1]
 				else
 					if isa(Var.(locfields{i}),'char'),
-						CharVar=Var.(locfields{i});
+						CharVar=Var.(locfields{i})';
 					else
-						CharVar=num2str(Var.(locfields{i}));
+						CharVar=num2str(Var.(locfields{i}))';
 					end
 					if length(CharVar)==0
 						CharVar='emptystruct';
 					end
-					startpoint=[i-1,1,0];
-				end
-
-				extent=[1,1,min(length(CharVar),40)];
+					startpoint=[0,1,i-1]
+				end
+
+				extent=[min(length(CharVar),40), 1, 1]
 				if length(CharVar)>40,
 					netcdf.putVar(groupID,varid,startpoint,extent,CharVar(1:40));
@@ -458,5 +486,5 @@
 	if dim>0,
 		for i=1:alldim,
-			if size(Var, i)>1 || i>dim,  %we skip dimensions with zero lenght but want to add dimensions from cells
+			if size(Var, i)>1 || i>dim || isa(Var, 'struct'),  %we skip dimensions with zero lenght but want to add dimensions from cells
 				indsize=find(varsize(i)==DimValue);
 				if length(indsize)>0
@@ -478,5 +506,5 @@
 	% struct also need an extra dimension 2, but only if non empty
 	if isa(Var,'struct'),
-		dims=[dims DimSize(3).index DimSize(4).index];
+		dims=[DimSize(4).index DimSize(3).index, dims];
 	end
 end
Index: /issm/trunk-jpl/src/m/contrib/defleurian/netCDF/export_netCDF.py
===================================================================
--- /issm/trunk-jpl/src/m/contrib/defleurian/netCDF/export_netCDF.py	(revision 27263)
+++ /issm/trunk-jpl/src/m/contrib/defleurian/netCDF/export_netCDF.py	(revision 27264)
@@ -99,4 +99,11 @@
     dimlist = [2, 40, md.mesh.numberofelements, md.mesh.numberofvertices, np.shape(md.mesh.elements)[1]]
     dimnames = ['DictDummy', 'StringLength', 'EltNum', 'VertNum', 'VertPerElt']
+    try:
+        dimlist = dimlist + [md.mesh.numberofedges]
+        dimnames = dimnames + ['EdgeNum']
+    except AttributeError:
+        #no edges on this mesh, we fix it at 0
+        dimlist += [0]
+        dimnames += ['EdgeNum']
     if verbose > 0:
         print('===Creating dimensions ===')
@@ -315,5 +322,4 @@
         if val_type.startswith('<U'):
             val_type = 'stringarray'
-            print(var)
     except AttributeError:
         val_type = type(var)
Index: /issm/trunk-jpl/src/m/io/loadvars.py
===================================================================
--- /issm/trunk-jpl/src/m/io/loadvars.py	(revision 27263)
+++ /issm/trunk-jpl/src/m/io/loadvars.py	(revision 27264)
@@ -55,4 +55,5 @@
 
     timeindex = False
+    SteadySols = ['ThermalSolution', 'HydrologySolution', 'StressbalanceSolution']
 
     for key, value in kwargs.items():
@@ -105,6 +106,10 @@
                     #here we have a more NC approach with time being a dimension
                     listtype = split(r'\.', classtype[mod][0])[1]
-                    print(listtype)
-                    if len(NCFile.dimensions['Time']) == 1:
+                    try:
+                        soltype = str(getattr(curclass, 'SolutionType'))
+                    except AttributeError:
+                        #might be an older format try that instead :
+                        soltype = str(getattr(curclass, 'sOLUTIONtYPE'))
+                    if len(NCFile.dimensions['Time']) == 1 or soltype in SteadySols:
                         nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]] = getattr(classtype[mod][1], listtype)()
                         Tree = nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]]
@@ -148,4 +153,7 @@
                     Tree = nvdict['md'].__dict__[classtree[mod][0]].__dict__[defname][defindex - 1]
                 #}}}
+                elif classtype[mod][0] == 'collections.OrderedDict':  #Treating multiple toolkits {{{
+                    nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]] = getattr(classtype[mod][1], 'OrderedDict')
+                    Tree = nvdict['md'].__dict__[classtree[mod][0]].__dict__[classtree[mod][1]]
                 else:
                     if verbose > 0:
@@ -184,6 +192,10 @@
             else:
                 groupclass = [curclass]
-            #==== We deal with Variables {{{
             for groupindex, listclass in enumerate(groupclass):
+                try:
+                    soltype = str(getattr(listclass, 'SolutionType'))
+                except AttributeError:
+                    soltype = 'NoSol'
+                #==== We deal with Variables {{{
                 for var in listclass.variables:
                     if not resname or var == resname:
@@ -217,9 +229,11 @@
                                         else:
                                             print('table dimension greater than 3 not implemented yet')
+                                    elif soltype in SteadySols:
+                                        Tree.__dict__[str(var)] = varval[:].data
                                     else:  #old format had step sorted in difeerent group so last group is last time
                                         Tree[0].__dict__[str(var)] = varval[:].data
                                 else:
                                     if NewFormat:
-                                        incomplete = 'Time' not in varval.dimensions
+                                        incomplete = 'Time' not in varval.dimensions and soltype not in SteadySols
                                         if incomplete:
                                             try:
@@ -230,22 +244,27 @@
                                                 #just one step, so no dimension, we just put it on the first solutionstep
                                                 timelist = [0]
+                                        elif soltype in SteadySols:
+                                            timelist = [0]
                                         else:
                                             timelist = np.arange(0, len(NCFile.dimensions['Time']))
-                                        for t in timelist:
-                                            if verbose > 5:
-                                                print("filing step {} for {}".format(t, var))
-                                            if vardim == 0:
-                                                Tree[t].__dict__[str(var)] = varval[:].data
-                                            elif vardim == 1:
-                                                stepval = ma.masked_array(varval[t].data, mask=np.where(np.isnan(varval[t]), 1, 0))
-                                                Tree[t].__dict__[str(var)] = ma.compressed(stepval)
-                                            elif vardim == 2:
-                                                stepval = ma.masked_array(varval[t, :].data, mask=np.where(np.isnan(varval[t, :]), 1, 0))
-                                                Tree[t].__dict__[str(var)] = ma.compressed(stepval)
-                                            elif vardim == 3:
-                                                stepval = ma.masked_array(varval[t, :, :].data, mask=np.where(np.isnan(varval[t, :, :]), 1, 0))
-                                                Tree[t].__dict__[str(var)] = ma.compressed(stepval).reshape((stepval.count(0)[0], stepval.count(1)[0]))
-                                            else:
-                                                print('table dimension greater than 3 not implemented yet')
+                                        if soltype in SteadySols:
+                                            Tree.__dict__[str(var)] = varval[:].data
+                                        else:
+                                            for t in timelist:
+                                                if verbose > 5:
+                                                    print("filing step {} for {}".format(t, var))
+                                                if vardim == 0:
+                                                    Tree[t].__dict__[str(var)] = varval[:].data
+                                                elif vardim == 1:
+                                                    stepval = ma.masked_array(varval[t].data, mask=np.where(np.isnan(varval[t]), 1, 0))
+                                                    Tree[t].__dict__[str(var)] = ma.compressed(stepval)
+                                                elif vardim == 2:
+                                                    stepval = ma.masked_array(varval[t, :].data, mask=np.where(np.isnan(varval[t, :]), 1, 0))
+                                                    Tree[t].__dict__[str(var)] = ma.compressed(stepval)
+                                                elif vardim == 3:
+                                                    stepval = ma.masked_array(varval[t, :, :].data, mask=np.where(np.isnan(varval[t, :, :]), 1, 0))
+                                                    Tree[t].__dict__[str(var)] = ma.compressed(stepval).reshape((stepval.count(0)[0], stepval.count(1)[0]))
+                                                else:
+                                                    print('table dimension greater than 3 not implemented yet')
                                     else:
                                         if verbose > 0:
@@ -315,5 +334,17 @@
                                             Tree.__dict__[str(var)] = varval[:, :].data
                                 elif vardim == 3:
-                                    Tree.__dict__[str(var)] = varval[:, :, :].data
+                                    if varval.dtype == "|S1":  #that is for matlab chararcter arrays
+                                        #most likely that is a toolkit dictionar so should be treated as such
+                                        #first we convert the character table to strings
+                                        stringtable = []
+                                        for i in range(np.shape(varval)[0]):
+                                            stringtable.append([chartostring(varval[i, 0, :]), chartostring(varval[i, 1, :])])
+                                        stringtable = np.asarray(stringtable, dtype=str)
+                                        Tree.__dict__[str(var)] = OrderedDict([('toolkit', str(varval[np.where(stringtable[:, 0] == 'toolkit')[0][0], 1]))])
+                                        strings1 = [str(arg[0]) for arg in stringtable if arg[0] != 'toolkits']
+                                        strings2 = [str(arg[1]) for arg in stringtable if arg[0] != 'toolkits']
+                                        Tree.__dict__[str(var)].update(list(zip(strings1, strings2)))
+                                    else:
+                                        Tree.__dict__[str(var)] = varval[:, :, :].data
                                 else:
                                     print('table dimension greater than 3 not implemented yet')
@@ -387,9 +418,10 @@
                 if class_dict[classe][0] not in ['dict', 'list', 'cell']:
                     modulename = split(r'\.', class_dict[classe][0])[0]
-                    if modulename == "giaivins":
-                        print("WARNING: module {} does not exist anymore and is skipped".format(modulename))
-                    else:
+                    try:
                         class_dict[classe].append(import_module(modulename))
                         class_tree[classe] = [group, ]
+                    except ModuleNotFoundError:
+                        print("WARNING: module {} does not exist anymore and is skipped".format(modulename))
+
             except AttributeError:
                 print(('group {} is empty'.format(group)))
