Index: /issm/trunk/src/m/classes/autodiff.m
===================================================================
--- /issm/trunk/src/m/classes/autodiff.m	(revision 9738)
+++ /issm/trunk/src/m/classes/autodiff.m	(revision 9739)
@@ -35,4 +35,7 @@
 			end
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/balancethickness.m
===================================================================
--- /issm/trunk/src/m/classes/balancethickness.m	(revision 9738)
+++ /issm/trunk/src/m/classes/balancethickness.m	(revision 9739)
@@ -39,4 +39,7 @@
 
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/basalforcings.m
===================================================================
--- /issm/trunk/src/m/classes/basalforcings.m	(revision 9738)
+++ /issm/trunk/src/m/classes/basalforcings.m	(revision 9739)
@@ -35,4 +35,7 @@
 			end
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/diagnostic.m
===================================================================
--- /issm/trunk/src/m/classes/diagnostic.m	(revision 9738)
+++ /issm/trunk/src/m/classes/diagnostic.m	(revision 9739)
@@ -77,4 +77,14 @@
 
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+			fields={'icefront'};
+			if (md.mesh.dimension==2),
+				checksize(md,'diagnostic',fields,[NaN 4]);
+			elseif md.mesh.dimension==3,
+				checksize(md,'diagnostic',fields,[NaN 6]);
+			end
+			fields={'icefront(:,end)'};
+			checkvalues(md,'diagnostic',fields,[0 1 2]);
+		end % }}}
 		function disp(obj) % {{{
 
Index: /issm/trunk/src/m/classes/flaim.m
===================================================================
--- /issm/trunk/src/m/classes/flaim.m	(revision 9738)
+++ /issm/trunk/src/m/classes/flaim.m	(revision 9739)
@@ -43,9 +43,13 @@
 		function checkconsistency(obj,md) % {{{
 
-			if ~exist(obj.flaim.tracks,'file')
+			if md.private.solution~=FlaimSolutionEnum,
+				return;
+			end
+
+			if ~exist(obj.tracks,'file')
 				checkmessage(['flaim.tracks file ''' md.flaim.tracks ''' does not exist.']);
 			end
 			%   probably going to need some checks on flaim.flightreqs here
-			if (numel(obj.flaim.criterion)~=md.mesh.numberofvertices) & (numel(md.flaim.criterion)~=md.mesh.numberofelements),
+			if (numel(obj.criterion)~=md.mesh.numberofvertices) & (numel(obj.criterion)~=md.mesh.numberofelements),
 				checkmessage(['flaim.criterion vector must have number of nodes (' ...
 					int2str(md.mesh.numberofvertices) ') or elements (' int2str(md.mesh.numberofelements)...
Index: /issm/trunk/src/m/classes/flowequation.m
===================================================================
--- /issm/trunk/src/m/classes/flowequation.m	(revision 9738)
+++ /issm/trunk/src/m/classes/flowequation.m	(revision 9739)
@@ -41,4 +41,7 @@
 
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/friction.m
===================================================================
--- /issm/trunk/src/m/classes/friction.m	(revision 9738)
+++ /issm/trunk/src/m/classes/friction.m	(revision 9739)
@@ -36,4 +36,7 @@
 
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 		function disp(obj) % {{{
 
Index: /issm/trunk/src/m/classes/geometry.m
===================================================================
--- /issm/trunk/src/m/classes/geometry.m	(revision 9738)
+++ /issm/trunk/src/m/classes/geometry.m	(revision 9739)
@@ -38,4 +38,7 @@
 
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/groundingline.m
===================================================================
--- /issm/trunk/src/m/classes/groundingline.m	(revision 9738)
+++ /issm/trunk/src/m/classes/groundingline.m	(revision 9739)
@@ -42,4 +42,7 @@
 
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/hydrology.m
===================================================================
--- /issm/trunk/src/m/classes/hydrology.m	(revision 9738)
+++ /issm/trunk/src/m/classes/hydrology.m	(revision 9739)
@@ -49,4 +49,7 @@
 			obj.stabilization=1;
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/initialization.m
===================================================================
--- /issm/trunk/src/m/classes/initialization.m	(revision 9738)
+++ /issm/trunk/src/m/classes/initialization.m	(revision 9739)
@@ -41,4 +41,7 @@
 
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/inversion.m
===================================================================
--- /issm/trunk/src/m/classes/inversion.m	(revision 9738)
+++ /issm/trunk/src/m/classes/inversion.m	(revision 9739)
@@ -86,4 +86,7 @@
 
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 		function disp(obj) % {{{
 			fielddisplay(obj,'iscontrol','is inversion activated?');
Index: /issm/trunk/src/m/classes/mask.m
===================================================================
--- /issm/trunk/src/m/classes/mask.m	(revision 9738)
+++ /issm/trunk/src/m/classes/mask.m	(revision 9739)
@@ -39,4 +39,7 @@
 
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 		function disp(obj) % {{{
 
Index: /issm/trunk/src/m/classes/materials.m
===================================================================
--- /issm/trunk/src/m/classes/materials.m	(revision 9738)
+++ /issm/trunk/src/m/classes/materials.m	(revision 9739)
@@ -75,4 +75,7 @@
 			obj.rheology_law='Paterson';
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 		function disp(obj) % {{{
 			disp(sprintf('   Materials:\n'));
Index: /issm/trunk/src/m/classes/mesh.m
===================================================================
--- /issm/trunk/src/m/classes/mesh.m	(revision 9738)
+++ /issm/trunk/src/m/classes/mesh.m	(revision 9739)
@@ -83,4 +83,44 @@
 			checkgreaterstrict(md,'mesh',fields,0);
 
+			fields={'elements'};
+			if(md.mesh.dimension==2),
+				checksize(md,'mesh',fields,[md.mesh.numberofelements 3]);
+			else
+				checksize(md,'mesh',fields,[md.mesh.numberofelements 6]);
+			end
+			if any(~ismember(1:md.mesh.numberofvertices,sort(unique(md.mesh.elements(:)))));
+				checkmessage('orphan nodes have been found. Check the mesh');
+			end
+
+			%Solution specific checks
+			switch(md.private.solution),
+				case PrognosticSolutionEnum,
+					if md.prognostic.stabilization==3,
+						if md.mesh.dimension~=2, checkmessage('Discontinuous Galerkin only supported for 2d meshes'); end
+						fields={'edges'};
+						checksize(md,'mesh',fields,[NaN 4]);
+						fields={'edges(:,1:3)'};
+						checknan(md,'mesh',fields);
+						checkgreaterstrict(md,'mesh',fields,0);
+					end
+				case BalancethicknessSolutionEnum,
+					if md.balancethickness.stabilization==3,
+						if md.mesh.dimension~=2, checkmessage('Discontinuous Galerkin only supported for 2d meshes'); end
+						fields={'edges'};
+						checksize(md,'mesh',fields,[NaN 4]);
+						fields={'edges(:,1:3)'};
+						checknan(md,'mesh',fields);
+						checkgreaterstrict(md,'mesh',fields,0);
+					end
+				case TransientSolutionEnum,
+					if md.transient.isprognostic & md.prognostic.stabilization==3,
+						if md.mesh.dimension~=2, checkmessage('Discontinuous Galerkin only supported for 2d meshes'); end
+						fields={'edges'};
+						checksize(md,'mesh',fields,[NaN 4]);
+						fields={'edges(:,1:3)'};
+						checknan(md,'mesh',fields);
+						checkgreaterstrict(md,'mesh',fields,0);
+					end
+			end
 		end % }}}
 		function disp(obj) % {{{
Index: /issm/trunk/src/m/classes/private.m
===================================================================
--- /issm/trunk/src/m/classes/private.m	(revision 9738)
+++ /issm/trunk/src/m/classes/private.m	(revision 9739)
@@ -36,4 +36,7 @@
 
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/prognostic.m
===================================================================
--- /issm/trunk/src/m/classes/prognostic.m	(revision 9738)
+++ /issm/trunk/src/m/classes/prognostic.m	(revision 9739)
@@ -46,4 +46,7 @@
 			obj.hydrostatic_adjustment='Absolute';
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 		function disp(obj) % {{{
 			disp(sprintf('   Prognostic solution parameters:'));
Index: /issm/trunk/src/m/classes/qmu.m
===================================================================
--- /issm/trunk/src/m/classes/qmu.m	(revision 9738)
+++ /issm/trunk/src/m/classes/qmu.m	(revision 9739)
@@ -47,4 +47,7 @@
 				obj.(fieldname)=obj.(fieldname).default;
 			end
+		end % }}}
+		function checkconsistency(obj,md) % {{{
+
 		end % }}}
 		function disp(obj) % {{{
Index: /issm/trunk/src/m/classes/rifts.m
===================================================================
--- /issm/trunk/src/m/classes/rifts.m	(revision 9738)
+++ /issm/trunk/src/m/classes/rifts.m	(revision 9739)
@@ -35,4 +35,7 @@
 			end
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/settings.m
===================================================================
--- /issm/trunk/src/m/classes/settings.m	(revision 9738)
+++ /issm/trunk/src/m/classes/settings.m	(revision 9739)
@@ -52,4 +52,7 @@
 			md.waitonlock=Inf;
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/solver.m
===================================================================
--- /issm/trunk/src/m/classes/solver.m	(revision 9738)
+++ /issm/trunk/src/m/classes/solver.m	(revision 9739)
@@ -40,4 +40,7 @@
 		 end
 		 %}}}
+		 function checkconsistency(obj,md) % {{{
+
+		 end % }}}
 		 function PetscFile(solver,filename) % {{{
 			 %PETSCFILE - build petsc file
Index: /issm/trunk/src/m/classes/steadystate.m
===================================================================
--- /issm/trunk/src/m/classes/steadystate.m	(revision 9738)
+++ /issm/trunk/src/m/classes/steadystate.m	(revision 9739)
@@ -41,4 +41,7 @@
 			obj.reltol=0.01;
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/surfaceforcings.m
===================================================================
--- /issm/trunk/src/m/classes/surfaceforcings.m	(revision 9738)
+++ /issm/trunk/src/m/classes/surfaceforcings.m	(revision 9739)
@@ -35,4 +35,7 @@
 			end
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/thermal.m
===================================================================
--- /issm/trunk/src/m/classes/thermal.m	(revision 9738)
+++ /issm/trunk/src/m/classes/thermal.m	(revision 9739)
@@ -50,4 +50,7 @@
 			obj.penalty_factor=3;
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 		function disp(obj) % {{{
 			disp(sprintf('   Thermal solution parameters:'));
Index: /issm/trunk/src/m/classes/timestepping.m
===================================================================
--- /issm/trunk/src/m/classes/timestepping.m	(revision 9738)
+++ /issm/trunk/src/m/classes/timestepping.m	(revision 9739)
@@ -46,4 +46,7 @@
 			obj.cfl_coefficient=.5;
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/transient.m
===================================================================
--- /issm/trunk/src/m/classes/transient.m	(revision 9738)
+++ /issm/trunk/src/m/classes/transient.m	(revision 9739)
@@ -52,4 +52,7 @@
 
 		end % }}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 	end
 end
Index: /issm/trunk/src/m/classes/verbose.m
===================================================================
--- /issm/trunk/src/m/classes/verbose.m	(revision 9738)
+++ /issm/trunk/src/m/classes/verbose.m	(revision 9739)
@@ -99,4 +99,7 @@
 		end
 		%}}}
+		function checkconsistency(obj,md) % {{{
+
+		end % }}}
 		function disp(verbose) % {{{1
 			
Index: /issm/trunk/src/m/model/ismodelselfconsistent.m
===================================================================
--- /issm/trunk/src/m/model/ismodelselfconsistent.m	(revision 9738)
+++ /issm/trunk/src/m/model/ismodelselfconsistent.m	(revision 9739)
@@ -8,13 +8,17 @@
 modelconsistency(true);
 
-%General consistency checks
-md.mesh.checkconsistency(md);
-
-%Solution dependent checks
-%FLAIM {{{1
-switch(md.private.solution),
-	case FlaimSolutionEnum, md.flaim.checkconsistency(md);
+%Go through al model field check that it is a class and call checkconsistency
+fields=properties(md);
+for i=1:length(fields),
+	field=fields{i};
+	if ismember(field,{'cluster' 'results' 'debug' 'radaroverlay'}),
+		continue;
+	end
+	if ~isobject(md.(field))
+		checkmessage(['field ''' char(field) ''' is not an object']);
+	else
+		md.(field).checkconsistency(md);
+	end
 end
-%}}}
 
 %error message if mode is not consistent
Index: /issm/trunk/src/m/utils/consistency/checkforcing.m
===================================================================
--- /issm/trunk/src/m/utils/consistency/checkforcing.m	(revision 9738)
+++ /issm/trunk/src/m/utils/consistency/checkforcing.m	(revision 9739)
@@ -11,15 +11,15 @@
 	if size(field,1)==md.mesh.numberofvertices,
 		if ~size(field,2)==1,
-			checkmessage(['model not consistent: field ''' obj '.' fields{i} ''' should have only one column as there are md.mesh.numberofvertices lines']);
+			checkmessage(['field ''' obj '.' fields{i} ''' should have only one column as there are md.mesh.numberofvertices lines']);
 		end
 	elseif size(field,1)==md.mesh.numberofvertices+1
 		if any(field(end,:)~=sort(field(end,:))),
-			checkmessage(['model not consistent: field ''' obj '.' fields{i} ''' columns should be chronological']);
+			checkmessage(['field ''' obj '.' fields{i} ''' columns should be chronological']);
 		end
 		if any(field(end,1:end-1)==field(end,2:end)),
-			checkmessage(['model not consistent: field ''' obj '.' fields{i} ''' columns must not contain duplicate timesteps']);
+			checkmessage(['field ''' obj '.' fields{i} ''' columns must not contain duplicate timesteps']);
 		end
 	else
-		checkmessage(['model not consistent: field ''' obj '.' fields{i} ''' should have md.mesh.numberofvertices or md.mesh.numberofvertices+1 lines']);
+		checkmessage(['field ''' obj '.' fields{i} ''' should have md.mesh.numberofvertices or md.mesh.numberofvertices+1 lines']);
 	end
 end
Index: /issm/trunk/src/m/utils/consistency/checkgreater.m
===================================================================
--- /issm/trunk/src/m/utils/consistency/checkgreater.m	(revision 9738)
+++ /issm/trunk/src/m/utils/consistency/checkgreater.m	(revision 9739)
@@ -10,5 +10,5 @@
 	eval(['field=md.' obj '.' fields{i} ';']);
 	if any(field<lowerbound),
-		checkmessage(['model not consistent: field ''' obj '.' fields{i} ''' should have values above ' num2str(lowerbound)]);
+		checkmessage(['field ''' obj '.' fields{i} ''' should have values above ' num2str(lowerbound)]);
 	end
 end
Index: /issm/trunk/src/m/utils/consistency/checkgreaterstrict.m
===================================================================
--- /issm/trunk/src/m/utils/consistency/checkgreaterstrict.m	(revision 9738)
+++ /issm/trunk/src/m/utils/consistency/checkgreaterstrict.m	(revision 9739)
@@ -10,5 +10,5 @@
 	eval(['field=md.' obj '.' fields{i} ';']);
 	if any(field<=lowerbound),
-		checkmessage(['model not consistent: field ''' obj '.' fields{i} ''' should have values stricly above ' num2str(lowerbound)]);
+		checkmessage(['field ''' obj '.' fields{i} ''' should have values stricly above ' num2str(lowerbound)]);
 	end
 end
Index: /issm/trunk/src/m/utils/consistency/checklength.m
===================================================================
--- /issm/trunk/src/m/utils/consistency/checklength.m	(revision 9738)
+++ /issm/trunk/src/m/utils/consistency/checklength.m	(revision 9739)
@@ -10,5 +10,5 @@
 	eval(['field=md.' obj '.' fields{i} ';']);
 	if length(field)~=fieldlength,
-		checkmessage(['model not consistent: field ''' obj '.' fields{i} ''' length should be ' num2str(fieldlength)]);
+		checkmessage(['field ''' obj '.' fields{i} ''' length should be ' num2str(fieldlength)]);
 	end
 end
Index: /issm/trunk/src/m/utils/consistency/checkless.m
===================================================================
--- /issm/trunk/src/m/utils/consistency/checkless.m	(revision 9738)
+++ /issm/trunk/src/m/utils/consistency/checkless.m	(revision 9739)
@@ -10,5 +10,5 @@
 	eval(['field=md.' obj '.' fields{i} ';']);
 	if any(field>upperbound),
-		checkmessage(['model not consistent: field ''' obj '.' fields{i} ''' should have values below ' num2str(upperbound)]);
+		checkmessage(['field ''' obj '.' fields{i} ''' should have values below ' num2str(upperbound)]);
 	end
 end
Index: /issm/trunk/src/m/utils/consistency/checklessstrict.m
===================================================================
--- /issm/trunk/src/m/utils/consistency/checklessstrict.m	(revision 9738)
+++ /issm/trunk/src/m/utils/consistency/checklessstrict.m	(revision 9739)
@@ -10,5 +10,5 @@
 	eval(['field=md.' obj '.' fields{i} ';']);
 	if any(field>=upperbound),
-		checkmessage(['model not consistent: field ''' obj '.' fields{i} ''' should have values stricly below ' num2str(upperbound)]);
+		checkmessage(['field ''' obj '.' fields{i} ''' should have values stricly below ' num2str(upperbound)]);
 	end
 end
Index: /issm/trunk/src/m/utils/consistency/checkmessage.m
===================================================================
--- /issm/trunk/src/m/utils/consistency/checkmessage.m	(revision 9738)
+++ /issm/trunk/src/m/utils/consistency/checkmessage.m	(revision 9739)
@@ -7,4 +7,4 @@
 %      checkmessage(string);
 
-disp(string);
+disp(['model not consistent: ' string]);
 modelconsistency(false);
Index: /issm/trunk/src/m/utils/consistency/checknan.m
===================================================================
--- /issm/trunk/src/m/utils/consistency/checknan.m	(revision 9738)
+++ /issm/trunk/src/m/utils/consistency/checknan.m	(revision 9739)
@@ -10,5 +10,5 @@
 	eval(['field=md.' obj '.' fields{i} ';']);
 	if any(isnan(field)),
-		checkmessage(['model not consistent: NaN values found in field ''' obj '.' fields{i}'''']);
+		checkmessage(['NaN values found in field ''' obj '.' fields{i}'''']);
 	end
 end
Index: /issm/trunk/src/m/utils/consistency/checknonempty.m
===================================================================
--- /issm/trunk/src/m/utils/consistency/checknonempty.m	(revision 9739)
+++ /issm/trunk/src/m/utils/consistency/checknonempty.m	(revision 9739)
@@ -0,0 +1,14 @@
+function checknonempty(md,obj,fields)
+%CHECKNONEMPTY - checknonempty
+%
+%   Used to check model consistency
+%
+%   Usage:
+%      checknonempty(md,obj,field);
+
+for i=1:length(fields),
+	eval(['field=md.' obj '.' fields{i} ';']);
+	if isempty(field),
+		checkmessage(['field ''' obj '.' fields{i} ''' is empty']);
+	end
+end
Index: /issm/trunk/src/m/utils/consistency/checkreal.m
===================================================================
--- /issm/trunk/src/m/utils/consistency/checkreal.m	(revision 9738)
+++ /issm/trunk/src/m/utils/consistency/checkreal.m	(revision 9739)
@@ -10,5 +10,5 @@
 	eval(['field=md.' obj '.' fields{i} ';']);
 	if any(~isreal(field))
-		checkmessage(['model not consistent: complex values found in field ''' obj '.' fields{i}'''']);
+		checkmessage(['complex values found in field ''' obj '.' fields{i}'''']);
 	end
 end
Index: /issm/trunk/src/m/utils/consistency/checksize.m
===================================================================
--- /issm/trunk/src/m/utils/consistency/checksize.m	(revision 9738)
+++ /issm/trunk/src/m/utils/consistency/checksize.m	(revision 9739)
@@ -11,13 +11,13 @@
 	if isnan(fieldsize(1)),
 		if (size(field,2)~=fieldsize(2)),
-			checkmessage(['model not consistent: field ''' obj '.' fields{i} ''' should have ' num2str(fieldsize(2)) ' columns']);
+			checkmessage(['field ''' obj '.' fields{i} ''' should have ' num2str(fieldsize(2)) ' columns']);
 		end
 	elseif isnan(fieldsize(2)),
 		if (size(field,1)~=fieldsize(1)),
-			checkmessage(['model not consistent: field ''' obj '.' fields{i} ''' should have ' num2str(fieldsize(1)) ' rows']);
+			checkmessage(['field ''' obj '.' fields{i} ''' should have ' num2str(fieldsize(1)) ' rows']);
 		end
 	else
 		if ((size(field)~=fieldsize(1)) |  (size(field,2)~=fieldsize(2)))
-			checkmessage(['model not consistent: field ''' obj '.' fields{i} ''' size should be ' num2str(fieldsize(1)) ' x ' num2str(fieldsize(2))]);
+			checkmessage(['field ''' obj '.' fields{i} ''' size should be ' num2str(fieldsize(1)) ' x ' num2str(fieldsize(2))]);
 		end
 	end
Index: /issm/trunk/src/m/utils/consistency/checkvalues.m
===================================================================
--- /issm/trunk/src/m/utils/consistency/checkvalues.m	(revision 9738)
+++ /issm/trunk/src/m/utils/consistency/checkvalues.m	(revision 9739)
@@ -10,5 +10,5 @@
 	eval(['field=md.' obj '.' fields{i} ';']);
 	if any(~ismember(field,values)),
-		checkmessage(['model not consistent: field ''' obj '.' fields{i} ''' should have values in ' num2str(values)]);
+		checkmessage(['field ''' obj '.' fields{i} ''' should have values in ' num2str(values)]);
 	end
 end
