Index: /issm/trunk-jpl/src/m/classes/constants.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/constants.py	(revision 23782)
+++ /issm/trunk-jpl/src/m/classes/constants.py	(revision 23783)
@@ -49,8 +49,8 @@
 	def checkconsistency(self,md,solution,analyses):    # {{{
 
-		md = checkfield(md,'fieldname','constants.g','>=',0,'size',[1,1])
-		md = checkfield(md,'fieldname','constants.omega','>=',0,'size',[1,1])
-		md = checkfield(md,'fieldname','constants.yts','>',0,'size',[1,1])
-		md = checkfield(md,'fieldname','constants.referencetemperature','size',[1,1])
+		md = checkfield(md,'fieldname','constants.g','>=',0,'size',[1])
+		md = checkfield(md,'fieldname','constants.omega','>=',0,'size',[1])
+		md = checkfield(md,'fieldname','constants.yts','>',0,'size',[1])
+		md = checkfield(md,'fieldname','constants.referencetemperature','size',[1])
 
 		return md
Index: /issm/trunk-jpl/src/m/classes/transient.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/transient.py	(revision 23782)
+++ /issm/trunk-jpl/src/m/classes/transient.py	(revision 23783)
@@ -4,174 +4,174 @@
 
 class transient(object):
-	"""
-	TRANSIENT class definition
+    """
+    TRANSIENT class definition
 
-	   Usage:
-	      transient=transient();
-	"""
+       Usage:
+          transient=transient();
+    """
 
-	def __init__(self): # {{{
-		self.issmb   	       = False
-		self.ismasstransport   = False
-		self.isstressbalance   = False
-		self.isthermal         = False
-		self.isgroundingline   = False
-		self.isgia             = False
-		self.isesa             = False
-		self.isdamageevolution = False
-		self.ismovingfront     = False
-		self.ishydrology       = False
-		self.isslr             = False
-		self.iscoupler         = False
-		self.amr_frequency     = 0
-		self.isoceancoupling   = False
-		self.requested_outputs = []
+    def __init__(self): # {{{
+        self.issmb              = False
+        self.ismasstransport   = False
+        self.isstressbalance   = False
+        self.isthermal         = False
+        self.isgroundingline   = False
+        self.isgia             = False
+        self.isesa             = False
+        self.isdamageevolution = False
+        self.ismovingfront     = False
+        self.ishydrology       = False
+        self.isslr             = False
+        self.iscoupler         = False
+        self.amr_frequency     = 0
+        self.isoceancoupling   = False
+        self.requested_outputs = []
 
-		#set defaults
-		self.setdefaultparameters()
+        #set defaults
+        self.setdefaultparameters()
 
-		#}}}
-	def __repr__(self): # {{{
-		string='   transient solution parameters:'
-		string="%s\n%s"%(string,fielddisplay(self,'issmb','indicates if a surface mass balance solution is used in the transient'))
-		string="%s\n%s"%(string,fielddisplay(self,'ismasstransport','indicates if a masstransport solution is used in the transient'))
-		string="%s\n%s"%(string,fielddisplay(self,'isstressbalance','indicates if a stressbalance solution is used in the transient'))
-		string="%s\n%s"%(string,fielddisplay(self,'isthermal','indicates if a thermal solution is used in the transient'))
-		string="%s\n%s"%(string,fielddisplay(self,'isgroundingline','indicates if a groundingline migration is used in the transient'))
-		string="%s\n%s"%(string,fielddisplay(self,'isgia','indicates if a postglacial rebound is used in the transient'))
-		string="%s\n%s"%(string,fielddisplay(self,'isesa','indicates whether an elastic adjustment model is used in the transient'))
-		string="%s\n%s"%(string,fielddisplay(self,'isdamageevolution','indicates whether damage evolution is used in the transient'))
-		string="%s\n%s"%(string,fielddisplay(self,'ismovingfront','indicates whether a moving front capability is used in the transient'))
-		string="%s\n%s"%(string,fielddisplay(self,'ishydrology','indicates whether an hydrology model is used'))
-		string="%s\n%s"%(string,fielddisplay(self,'isslr','indicates if a sea level rise solution is used in the transient'))
-		string="%s\n%s"%(string,fielddisplay(self,'isoceancoupling','indicates whether coupling with an ocean model is used in the transient'))
-		string="%s\n%s"%(string,fielddisplay(self,'iscoupler','indicates whether different models are being run with need for coupling'))
-		string="%s\n%s"%(string,fielddisplay(self,'amr_frequency','frequency at which mesh is refined in simulations with multiple time_steps'))
-		string="%s\n%s"%(string,fielddisplay(self,'requested_outputs','list of additional outputs requested'))
-		return string
-		#}}}
-	def defaultoutputs(self,md): # {{{
+        #}}}
+    def __repr__(self): # {{{
+        string='   transient solution parameters:'
+        string="%s\n%s"%(string,fielddisplay(self,'issmb','indicates if a surface mass balance solution is used in the transient'))
+        string="%s\n%s"%(string,fielddisplay(self,'ismasstransport','indicates if a masstransport solution is used in the transient'))
+        string="%s\n%s"%(string,fielddisplay(self,'isstressbalance','indicates if a stressbalance solution is used in the transient'))
+        string="%s\n%s"%(string,fielddisplay(self,'isthermal','indicates if a thermal solution is used in the transient'))
+        string="%s\n%s"%(string,fielddisplay(self,'isgroundingline','indicates if a groundingline migration is used in the transient'))
+        string="%s\n%s"%(string,fielddisplay(self,'isgia','indicates if a postglacial rebound is used in the transient'))
+        string="%s\n%s"%(string,fielddisplay(self,'isesa','indicates whether an elastic adjustment model is used in the transient'))
+        string="%s\n%s"%(string,fielddisplay(self,'isdamageevolution','indicates whether damage evolution is used in the transient'))
+        string="%s\n%s"%(string,fielddisplay(self,'ismovingfront','indicates whether a moving front capability is used in the transient'))
+        string="%s\n%s"%(string,fielddisplay(self,'ishydrology','indicates whether an hydrology model is used'))
+        string="%s\n%s"%(string,fielddisplay(self,'isslr','indicates if a sea level rise solution is used in the transient'))
+        string="%s\n%s"%(string,fielddisplay(self,'isoceancoupling','indicates whether coupling with an ocean model is used in the transient'))
+        string="%s\n%s"%(string,fielddisplay(self,'iscoupler','indicates whether different models are being run with need for coupling'))
+        string="%s\n%s"%(string,fielddisplay(self,'amr_frequency','frequency at which mesh is refined in simulations with multiple time_steps'))
+        string="%s\n%s"%(string,fielddisplay(self,'requested_outputs','list of additional outputs requested'))
+        return string
+        #}}}
+    def defaultoutputs(self,md): # {{{
 
-		if self.issmb:
-			return ['SmbMassBalance']
-		else:
-			return []
+        if self.issmb:
+            return ['SmbMassBalance']
+        else:
+            return []
 
-	#}}}
-	def setallnullparameters(self): # {{{
-		
-		#Nothing done
-		self.issmb   = False
-		self.ismasstransport   = False
-		self.isstressbalance   = False
-		self.isthermal         = False
-		self.isgroundingline   = False
-		self.isgia             = False
-		self.isesa             = False
-		self.isdamageevolution = False
-		self.ismovingfront     = False
-		self.ishydrology       = False
-		self.isoceancoupling   = False
-		self.isslr             = False
-		self.iscoupler         = False
-		self.amr_frequency	  = 0
+    #}}}
+    def setallnullparameters(self): # {{{
+        
+        #Nothing done
+        self.issmb   = False
+        self.ismasstransport   = False
+        self.isstressbalance   = False
+        self.isthermal         = False
+        self.isgroundingline   = False
+        self.isgia             = False
+        self.isesa             = False
+        self.isdamageevolution = False
+        self.ismovingfront     = False
+        self.ishydrology       = False
+        self.isoceancoupling   = False
+        self.isslr             = False
+        self.iscoupler         = False
+        self.amr_frequency      = 0
 
-		#default output
-		self.requested_outputs=[]
-		return self
-	#}}}
-	def deactivateall(self):#{{{
-		self.issmb             = False
-		self.ismasstransport   = False
-		self.isstressbalance   = False
-		self.isthermal         = False
-		self.isgroundingline   = False
-		self.isgia             = False
-		self.isesa             = False
-		self.isdamageevolution = False
-		self.ismovingfront     = False
-		self.ishydrology       = False
-		self.isslr             = False
-		self.isoceancoupling   = False
-		self.iscoupler         = False
-		self.amr_frequency     = 0
+        #default output
+        self.requested_outputs=[]
+        return self
+    #}}}
+    def deactivateall(self):#{{{
+        self.issmb             = False
+        self.ismasstransport   = False
+        self.isstressbalance   = False
+        self.isthermal         = False
+        self.isgroundingline   = False
+        self.isgia             = False
+        self.isesa             = False
+        self.isdamageevolution = False
+        self.ismovingfront     = False
+        self.ishydrology       = False
+        self.isslr             = False
+        self.isoceancoupling   = False
+        self.iscoupler         = False
+        self.amr_frequency     = 0
 
-		#default output
-		self.requested_outputs=[]
-		return self
-	#}}}
-	def setdefaultparameters(self): # {{{
-		
-		#full analysis: Stressbalance, Masstransport and Thermal but no groundingline migration for now
-		self.issmb             = True
-		self.ismasstransport   = True
-		self.isstressbalance   = True
-		self.isthermal         = True
-		self.isgroundingline   = False
-		self.isgia             = False
-		self.isesa             = False
-		self.isdamageevolution = False
-		self.ismovingfront     = False
-		self.ishydrology       = False
-		self.isslr             = False
-		self.isoceancoupling   = False
-		self.iscoupler         = False
-		self.amr_frequency     = 0
+        #default output
+        self.requested_outputs=[]
+        return self
+    #}}}
+    def setdefaultparameters(self): # {{{
+        
+        #full analysis: Stressbalance, Masstransport and Thermal but no groundingline migration for now
+        self.issmb             = True
+        self.ismasstransport   = True
+        self.isstressbalance   = True
+        self.isthermal         = True
+        self.isgroundingline   = False
+        self.isgia             = False
+        self.isesa             = False
+        self.isdamageevolution = False
+        self.ismovingfront     = False
+        self.ishydrology       = False
+        self.isslr             = False
+        self.isoceancoupling   = False
+        self.iscoupler         = False
+        self.amr_frequency     = 0
 
-		#default output
-		self.requested_outputs=['default']
-		return self
-	#}}}
-	def checkconsistency(self,md,solution,analyses):    # {{{
+        #default output
+        self.requested_outputs=['default']
+        return self
+    #}}}
+    def checkconsistency(self,md,solution,analyses):    # {{{
 
-		#Early return
-		if not solution=='TransientSolution':
-			return md
+        #Early return
+        if not solution=='TransientSolution':
+            return md
 
-		md = checkfield(md,'fieldname','transient.issmb','numel',[1],'values',[0,1])
-		md = checkfield(md,'fieldname','transient.ismasstransport','numel',[1],'values',[0,1])
-		md = checkfield(md,'fieldname','transient.isstressbalance','numel',[1],'values',[0,1])
-		md = checkfield(md,'fieldname','transient.isthermal','numel',[1],'values',[0,1])
-		md = checkfield(md,'fieldname','transient.isgroundingline','numel',[1],'values',[0,1])
-		md = checkfield(md,'fieldname','transient.isgia','numel',[1],'values',[0,1])
-		md = checkfield(md,'fieldname','transient.isesa','numel',[1],'values',[0,1])
-		md = checkfield(md,'fieldname','transient.isdamageevolution','numel',[1],'values',[0,1])
-		md = checkfield(md,'fieldname','transient.ishydrology','numel',[1],'values',[0,1])
-		md = checkfield(md,'fieldname','transient.ismovingfront','numel',[1],'values',[0,1]);
-		md = checkfield(md,'fieldname','transient.isslr','numel',[1],'values',[0,1])
-		md = checkfield(md,'fieldname','transient.isoceancoupling','numel',[1],'values',[0,1])
-		md = checkfield(md,'fieldname','transient.iscoupler','numel',[1],'values',[0,1])
-		md = checkfield(md,'fieldname','transient.amr_frequency','numel',[1],'>=',0,'NaN',1,'Inf',1)
-		md = checkfield(md,'fieldname','transient.requested_outputs','stringrow',1)
+        md = checkfield(md,'fieldname','transient.issmb','numel',[1],'values',[0,1])
+        md = checkfield(md,'fieldname','transient.ismasstransport','numel',[1],'values',[0,1])
+        md = checkfield(md,'fieldname','transient.isstressbalance','numel',[1],'values',[0,1])
+        md = checkfield(md,'fieldname','transient.isthermal','numel',[1],'values',[0,1])
+        md = checkfield(md,'fieldname','transient.isgroundingline','numel',[1],'values',[0,1])
+        md = checkfield(md,'fieldname','transient.isgia','numel',[1],'values',[0,1])
+        md = checkfield(md,'fieldname','transient.isesa','numel',[1],'values',[0,1])
+        md = checkfield(md,'fieldname','transient.isdamageevolution','numel',[1],'values',[0,1])
+        md = checkfield(md,'fieldname','transient.ishydrology','numel',[1],'values',[0,1])
+        md = checkfield(md,'fieldname','transient.ismovingfront','numel',[1],'values',[0,1]);
+        md = checkfield(md,'fieldname','transient.isslr','numel',[1],'values',[0,1])
+        md = checkfield(md,'fieldname','transient.isoceancoupling','numel',[1],'values',[0,1])
+        md = checkfield(md,'fieldname','transient.iscoupler','numel',[1],'values',[0,1])
+        md = checkfield(md,'fieldname','transient.amr_frequency','numel',[1],'>=',0,'NaN',1,'Inf',1)
+        md = checkfield(md,'fieldname','transient.requested_outputs','stringrow',1)
 
-		if (solution!='TransientSolution') and (md.transient.iscoupling):
-                    md.checkmessage("Coupling with ocean can only be done in transient simulations!")
-                if (md.transient.isdamageevolution and not hasattr(md.materials,'matdamageice')):
-                    md.checkmessage("requesting damage evolution but md.materials is not of class matdamageice")
+        if (solution!='TransientSolution') and (md.transient.iscoupling):
+            md.checkmessage("Coupling with ocean can only be done in transient simulations!")
+        if (md.transient.isdamageevolution and not hasattr(md.materials,'matdamageice')):
+            md.checkmessage("requesting damage evolution but md.materials is not of class matdamageice")
 
-		return md
-	# }}}
-	def marshall(self,prefix,md,fid):    # {{{
-		WriteData(fid,prefix,'object',self,'fieldname','issmb','format','Boolean')
-		WriteData(fid,prefix,'object',self,'fieldname','ismasstransport','format','Boolean')
-		WriteData(fid,prefix,'object',self,'fieldname','isstressbalance','format','Boolean')
-		WriteData(fid,prefix,'object',self,'fieldname','isthermal','format','Boolean')
-		WriteData(fid,prefix,'object',self,'fieldname','isgroundingline','format','Boolean')
-		WriteData(fid,prefix,'object',self,'fieldname','isgia','format','Boolean')
-		WriteData(fid,prefix,'object',self,'fieldname','isesa','format','Boolean')
-		WriteData(fid,prefix,'object',self,'fieldname','isdamageevolution','format','Boolean')
-		WriteData(fid,prefix,'object',self,'fieldname','ishydrology','format','Boolean')
-		WriteData(fid,prefix,'object',self,'fieldname','ismovingfront','format','Boolean')
-		WriteData(fid,prefix,'object',self,'fieldname','isslr','format','Boolean')
-		WriteData(fid,prefix,'object',self,'fieldname','isoceancoupling','format','Boolean')
-		WriteData(fid,prefix,'object',self,'fieldname','iscoupler','format','Boolean')
-		WriteData(fid,prefix,'object',self,'fieldname','amr_frequency','format','Integer')
+        return md
+    # }}}
+    def marshall(self,prefix,md,fid):    # {{{
+        WriteData(fid,prefix,'object',self,'fieldname','issmb','format','Boolean')
+        WriteData(fid,prefix,'object',self,'fieldname','ismasstransport','format','Boolean')
+        WriteData(fid,prefix,'object',self,'fieldname','isstressbalance','format','Boolean')
+        WriteData(fid,prefix,'object',self,'fieldname','isthermal','format','Boolean')
+        WriteData(fid,prefix,'object',self,'fieldname','isgroundingline','format','Boolean')
+        WriteData(fid,prefix,'object',self,'fieldname','isgia','format','Boolean')
+        WriteData(fid,prefix,'object',self,'fieldname','isesa','format','Boolean')
+        WriteData(fid,prefix,'object',self,'fieldname','isdamageevolution','format','Boolean')
+        WriteData(fid,prefix,'object',self,'fieldname','ishydrology','format','Boolean')
+        WriteData(fid,prefix,'object',self,'fieldname','ismovingfront','format','Boolean')
+        WriteData(fid,prefix,'object',self,'fieldname','isslr','format','Boolean')
+        WriteData(fid,prefix,'object',self,'fieldname','isoceancoupling','format','Boolean')
+        WriteData(fid,prefix,'object',self,'fieldname','iscoupler','format','Boolean')
+        WriteData(fid,prefix,'object',self,'fieldname','amr_frequency','format','Integer')
 
-		#process requested outputs
-		outputs = self.requested_outputs
-		indices = [i for i, x in enumerate(outputs) if x == 'default']
-		if len(indices) > 0:
-			outputscopy=outputs[0:max(0,indices[0]-1)]+self.defaultoutputs(md)+outputs[indices[0]+1:]
-			outputs    =outputscopy
-		WriteData(fid,prefix,'data',outputs,'name','md.transient.requested_outputs','format','StringArray')
-	# }}}
+        #process requested outputs
+        outputs = self.requested_outputs
+        indices = [i for i, x in enumerate(outputs) if x == 'default']
+        if len(indices) > 0:
+            outputscopy=outputs[0:max(0,indices[0]-1)]+self.defaultoutputs(md)+outputs[indices[0]+1:]
+            outputs    =outputscopy
+        WriteData(fid,prefix,'data',outputs,'name','md.transient.requested_outputs','format','StringArray')
+    # }}}
Index: /issm/trunk-jpl/src/m/consistency/checkfield.m
===================================================================
--- /issm/trunk-jpl/src/m/consistency/checkfield.m	(revision 23782)
+++ /issm/trunk-jpl/src/m/consistency/checkfield.m	(revision 23783)
@@ -98,5 +98,5 @@
 		for i=1:numel(fieldsize)
 			if ~isnan(fieldsize(i)) & (size(field,i)~=fieldsize(i))
-				md = checkmessage(md,getfieldvalue(options,'message',['field ''' fieldname ''' dimension # ' num2str(i) ' should be of size ' num2str(fieldsize(2))]));
+				md = checkmessage(md,getfieldvalue(options,'message',['field ''' fieldname ''' dimension # ' num2str(i) ' should be of size ' num2str(fieldsize(i))]));
 			end
 		end
Index: /issm/trunk-jpl/src/m/consistency/checkfield.py
===================================================================
--- /issm/trunk-jpl/src/m/consistency/checkfield.py	(revision 23782)
+++ /issm/trunk-jpl/src/m/consistency/checkfield.py	(revision 23783)
@@ -7,312 +7,290 @@
 
 def checkfield(md,*args):
-	"""
-	CHECKFIELD - check field consistency
-
-	   Used to check model consistency.,
-	   Requires:
-	   'field' or 'fieldname' option. If 'fieldname' is provided, it will retrieve it from the model md. (md.(fieldname))
+    """
+    CHECKFIELD - check field consistency
+
+       Used to check model consistency.,
+       Requires:
+       'field' or 'fieldname' option. If 'fieldname' is provided, it will retrieve it from the model md. (md.(fieldname))
              If 'field' is provided, it will assume the argument following 'field' is a numeric array.
 
-	   Available options:
-	      - NaN: 1 if check that there is no NaN
-	      - size: [lines cols], NaN for non checked dimensions, or 'universal' for any input type (nodal, element, time series, etc)
-	      - >:  greater than provided value
-	      - >=: greater or equal to provided value
-	      - <:  smallerthan provided value
-	      - <=: smaller or equal to provided value
-	      - < vec:  smallerthan provided values on each vertex
-	      - timeseries: 1 if check time series consistency (size and time)
-	      - values: cell of strings or vector of acceptable values
-	      - numel: list of acceptable number of elements
-	      - cell: 1 if check that is cell
-	      - empty: 1 if check that non empty
-	      - message: overloaded error message
-
-	   Usage:
-	      md = checkfield(md,fieldname,options);
-	"""
-
-	#get options
-	options=pairoptions(*args)
-
-	#get field from model
-	if options.exist('field'):
-		field=options.getfieldvalue('field')
-		fieldname=options.getfieldvalue('fieldname','no fieldname')
-	else:
-		fieldname=options.getfieldvalue('fieldname')
-		fieldprefix=split(r'\[(.*?)\]',fieldname)[0]
-		fieldindexes=findall(r'\[(.*?)\]',fieldname)
-		field=attrgetter(fieldprefix)(md)
-		for index in fieldindexes:
-			try:
-				field=field[index.strip("\'")]
-			except TypeError:
-				field=field[int(index)] #looking for an index and not a key
+       Available options:
+          - NaN: 1 if check that there is no NaN
+          - size: [lines cols], NaN for non checked dimensions, or 'universal' for any input type (nodal, element, time series, etc)
+          - >:  greater than provided value
+          - >=: greater or equal to provided value
+          - <:  smallerthan provided value
+          - <=: smaller or equal to provided value
+          - < vec:  smallerthan provided values on each vertex
+          - timeseries: 1 if check time series consistency (size and time)
+          - values: cell of strings or vector of acceptable values
+          - numel: list of acceptable number of elements
+          - cell: 1 if check that is cell
+          - empty: 1 if check that non empty
+          - message: overloaded error message
+
+       Usage:
+          md = checkfield(md,fieldname,options);
+    """
+
+    #get options
+    options=pairoptions(*args)
+
+    #get field from model
+    if options.exist('field'):
+        field=options.getfieldvalue('field')
+        fieldname=options.getfieldvalue('fieldname','no fieldname')
+    else:
+        fieldname=options.getfieldvalue('fieldname')
+        fieldprefix=split(r'\[(.*?)\]',fieldname)[0]
+        fieldindexes=findall(r'\[(.*?)\]',fieldname)
+        field=attrgetter(fieldprefix)(md)
+        for index in fieldindexes:
+            try:
+                field=field[index.strip("\'")]
+            except TypeError:
+                field=field[int(index)] #looking for an index and not a key
 
 # that works for py2
-#		exec("field=md.{}".format(fieldname))
-#		exec("field=md.{}".format(fieldname),namespace)
-
-
-	if isinstance(field,(bool,int,float)):
-		field=np.array([field])
-
-	#check empty
-	if options.exist('empty'):
-		if not field:
-			md = md.checkmessage(options.getfieldvalue('message',
-				"field '%s' is empty" % fieldname))
-
-	#Check size
-	if options.exist('size'):
-		fieldsize=options.getfieldvalue('size')
-		if type(fieldsize) == str:
-			if m.strcmp(fieldsize,'universal'):
-
-				#Check that vector size will not be confusing for ModelProcessorx
-				if (md.mesh.numberofvertices==md.mesh.numberofelements):
-					raise RuntimeError('number of vertices is the same as number of elements')
-				elif (md.mesh.numberofvertices+1==md.mesh.numberofelements):
-					raise RuntimeError('number of vertices +1 is the same as number of elements')
-				elif (md.mesh.numberofvertices==md.mesh.numberofelements+1):
-					raise RuntimeError('number of vertices is the same as number of elements +1')
-				
-				#Uniform field
-				if (np.size(field,0)==1):
-					if (np.shape(field,1)!=1):
-						md = md.checkmessage(options.getfieldvalue('message',"field '{}' is not supported".format(fieldname)))
-
-				#vertex oriented input, only one column allowed
-				elif (np.shape(field,0)==md.mesh.numberofvertices):
-					if (np.shape(field,1)!=1):
-						md = md.checkmessage(options.getfieldvalue('message',"field '{}' is not supported".format(fieldname)))
-
-				#element oriented input, one or more column (patch) is ok 
-				elif (np.shape(field,0)==md.mesh.numberofelements):
-					pass
-					#nothing to do here (either constant per element, or defined on nodes)
-
-				#vertex time series
-				elif (np.shape(field,0)==md.mesh.numberofvertices+1):
-					if (np.shape(field,1)<=1):
-						md = md.checkmessage(options.getfieldvalue('message',"field '{}' is not supported".format(fieldname)))
-
-				#element time series
-				elif (np.shape(field,0)==md.mesh.numberofelements+1):
-					if (np.shape(field,1)<=1):
-						md = md.checkmessage(options.getfieldvalue('message',"field '{}' is not supported".format(fieldname)))
-
-				#else not supported
-				else:
-					md = md.checkmessage(options.getfieldvalue('message',"field '{}' is not supported".format(fieldname)))
-
-			else:
-				raise RuntimeError("fieldsize '{}' not supported yet".format(fieldsize))
-
-		else:
-			if len(fieldsize) == 1:
-				if np.isnan(fieldsize[0]):
-					pass
-				elif np.ndim(field)==1:
-					if not np.size(field)==fieldsize[0]:
-						md = md.checkmessage(options.getfieldvalue('message',"field {} size should be {}".format(fieldname,fieldsize[0])))
-				else:
-					try:
-						exec("md.{}=np.squeeze(field)".format(fieldname))
-						print(("{} had been squeezed if it was a matrix with only one column".format(fieldname)))
-					except IndexError:
-						md = md.checkmessage(options.getfieldvalue('message',"field {} should have {} dimension".format(fieldname,len(fieldsize))))
-			elif len(fieldsize) == 2:
-				if   np.isnan(fieldsize[0]):
-					if not np.size(field,1)==fieldsize[1]:
-						md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have %d columns" % (fieldname,fieldsize[1])))
-				elif np.isnan(fieldsize[1]):
-					if not np.size(field,0)==fieldsize[0]:
-						md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have %d lines" % (fieldname,fieldsize[0])))
-				elif fieldsize[1]==1:
-					if (not np.size(field,0)==fieldsize[0]):
-						md = md.checkmessage(options.getfieldvalue('message',"field '%s' size should be %d x %d" % (fieldname,fieldsize[0],fieldsize[1])))
-				else:
-					if (not np.size(field,0)==fieldsize[0]) or (not np.size(field,1)==fieldsize[1]):
-						md = md.checkmessage(options.getfieldvalue('message',"field '%s' size should be %d x %d" % (fieldname,fieldsize[0],fieldsize[1])))
-
-	#Check numel
-	if options.exist('numel'):
-		fieldnumel=options.getfieldvalue('numel')
-		if (type(fieldnumel) == int and np.size(field) != fieldnumel) or (type(fieldnumel) == list and np.size(field) not in fieldnumel):
-			if   len(fieldnumel)==1:
-				md = md.checkmessage(options.getfieldvalue('message',\
-					"field '%s' size should be %d" % (fieldname,fieldnumel)))
-			elif len(fieldnumel)==2:
-				md = md.checkmessage(options.getfieldvalue('message',\
-					"field '%s' size should be %d or %d" % (fieldname,fieldnumel[0],fieldnumel[1])))
-			else:
-				md = md.checkmessage(options.getfieldvalue('message',\
-					"field '%s' size should be %s" % (fieldname,fieldnumel)))
-
-	#check NaN
-	if options.getfieldvalue('NaN',0):
-		if np.any(np.isnan(field)):
-			md = md.checkmessage(options.getfieldvalue('message',\
-				"NaN values found in field '%s'" % fieldname))
-
-
-	#check Inf
-	if options.getfieldvalue('Inf',0):
-		if np.any(np.isinf(field)):
-			md = md.checkmessage(options.getfieldvalue('message',\
-				"Inf values found in field '%s'" % fieldname))
-
-
-	#check cell
-	if options.getfieldvalue('cell',0):
-		if not isinstance(field,(tuple,list,dict)):
-			md = md.checkmessage(options.getfieldvalue('message',\
-				"field '%s' should be a cell" % fieldname))
-
-	#check values
-	if options.exist('values'):
-		fieldvalues=options.getfieldvalue('values')
-		if False in m.ismember(field,fieldvalues):
-			if   len(fieldvalues)==1:
-				md = md.checkmessage(options.getfieldvalue('message',\
-					"field '%s' value should be '%s'"  % (fieldname,fieldvalues[0])))
-			elif len(fieldvalues)==2:
-				md = md.checkmessage(options.getfieldvalue('message',\
-					"field '%s' values should be '%s' or '%s'"  % (fieldname,fieldvalues[0],fieldvalues[1])))
-			else:
-				md = md.checkmessage(options.getfieldvalue('message',\
-					"field '%s' should have values in %s" % (fieldname,fieldvalues)))
-
-	#check greater
-	if options.exist('>='):
-		lowerbound = options.getfieldvalue('>=')
-		if type(lowerbound) is str:
-			lowerbound=attrgetter(lowerbound)(md)
-		if np.size(lowerbound)>1: #checking elementwise
-			if any(field<upperbound):
-				md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values below %d" % (fieldname,upperbound)))
-		else:
-			minval=np.nanmin(field)
-			if options.getfieldvalue('timeseries',0):
-				minval=np.nanmin(field[:-1])
-			elif options.getfieldvalue('singletimeseries',0):
-				if np.size(field)==1: #some singletimeseries are just one value
-					minval=field
-				else:
-					minval=np.nanmin(field[0])
-
-			if minval<lowerbound:
-				md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values above %d" % (fieldname,lowerbound)))
-
-	if options.exist('>'):
-		lowerbound=options.getfieldvalue('>')
-		if type(lowerbound) is str:
-			lowerbound=attrgetter(lowerbound)(md)
-		if np.size(lowerbound)>1: #checking elementwise
-			if any(field<=upperbound):
-				md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values below %d" % (fieldname,upperbound)))
-		else:
-			minval=np.nanmin(field)
-			if options.getfieldvalue('timeseries',0) :
-				minval=np.nanmin(field[:-1])
-			elif options.getfieldvalue('singletimeseries',0):
-				if np.size(field)==1: #some singletimeseries are just one value
-					minval=field
-				else:
-					minval=np.nanmin(field[0])
-
-			if minval<=lowerbound:
-				md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values above %d" % (fieldname,lowerbound)))
-
-	#check smaller
-	if options.exist('<='):
-		upperbound=options.getfieldvalue('<=')
-		if type(upperbound) is str:
-			upperbound=attrgetter(upperbound)(md)
-		if np.size(upperbound)>1: #checking elementwise
-			if any(field>upperbound):
-				md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values below %d" % (fieldname,upperbound)))
-		else:
-			maxval=np.nanmax(field)
-			if options.getfieldvalue('timeseries',0):
-				maxval=np.nanmax(field[:-1])
-			elif  options.getfieldvalue('singletimeseries',0):
-				if np.size(field)==1: #some singletimeseries are just one value
-					maxval=field
-				else:
-					maxval=np.nanmax(field[0])
-			elif hasattr(field, 'fov_forward_indices'):
-				maxval=field.fov_forward_indices[0]
-			if maxval>upperbound:
-				md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values below %d" % (fieldname,upperbound)))
-
-	if options.exist('<'):
-		upperbound=options.getfieldvalue('<')
-		if type(upperbound) is str:
-			upperbound=attrgetter(upperbound)(md)
-		if np.size(upperbound)>1: #checking elementwise
-			if any(field>=upperbound):
-				md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values below %d" % (fieldname,upperbound)))
-
-		else:
-			maxval=np.nanmax(field)
-			if options.getfieldvalue('timeseries',0):
-				maxval=np.nanmax(field[:-1])
-			elif options.getfieldvalue('singletimeseries',0):
-				if np.size(field)==1: #some singletimeseries are just one value
-					maxval=field.copy()
-				else:
-					maxval=np.nanmax(field[0])
-
-				if maxval>=upperbound:
-					md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values below %d" % (fieldname,upperbound)))
-
-	#check file
-	if options.getfieldvalue('file',0):
-		if not os.path.exists(field):
-			md = md.checkmessage("file provided in '%s': '%s' does not exist" % (fieldname,field))
-
-	#Check row of strings
-	if options.exist('stringrow'):
-		if not isinstance(field,list):
-			md = md.checkmessage(options.getfieldvalue('message',\
-					"field '%s' should be a list" %fieldname))
-
-	#Check forcings (size and times)
-	if options.getfieldvalue('timeseries',0):
-		if np.size(field,0)==md.mesh.numberofvertices or np.size(field,0)==md.mesh.numberofelements:
-			if np.ndim(field)>1 and not np.size(field,1)==1:
-				md = md.checkmessage(options.getfieldvalue('message',\
-					"field '%s' should have only one column as there are md.mesh.numberofvertices lines" % fieldname))
-		elif np.size(field,0)==md.mesh.numberofvertices+1 or np.size(field,0)==md.mesh.numberofelements+1:
-			if np.ndim(field) > 1 and not all(field[-1,:]==np.sort(field[-1,:])):
-				md = md.checkmessage(options.getfieldvalue('message',\
-					"field '%s' columns should be sorted chronologically" % fieldname))
-			if np.ndim(field) > 1 and any(field[-1,0:-1]==field[-1,1:]):
-				md = md.checkmessage(options.getfieldvalue('message',\
-					"field '%s' columns must not contain duplicate timesteps" % fieldname))
-		else:
-			md = md.checkmessage(options.getfieldvalue('message',\
-				"field '%s' should have md.mesh.numberofvertices or md.mesh.numberofvertices+1 lines" % fieldname))
-
-	#Check single value forcings (size and times)
-	if options.getfieldvalue('singletimeseries',0):
-		if np.size(field,0)==2:
-			if not all(field[-1,:]==np.sort(field[-1,:])):
-				md = md.checkmessage(options.getfieldvalue('message',\
-						"field '%s' columns should be sorted chronologically" % fieldname))
-			if any(field[-1,0:-1]==field[-1,1:]):
-				md = md.checkmessage(options.getfieldvalue('message',\
-						"field '%s' columns must not contain duplicate timesteps" % fieldname))
-		elif np.size(field,0) == 1:
-			if np.ndim(field) > 1 and not np.size(field,1) == 1:
-				md = md.checkmessage(options.getfieldvalue('message',\
-				"field '%s' should be either a scalar or have 2 lines" % fieldname))
-		else:
-				md = md.checkmessage(options.getfieldvalue('message',\
-				"field '%s' should have 2 lines or be a scalar" % fieldname))
-
-	return md
+#        exec("field=md.{}".format(fieldname))
+#        exec("field=md.{}".format(fieldname),namespace)
+
+
+    if isinstance(field,(bool,int,float)):
+        field=np.array([field])
+
+    #check empty
+    if options.exist('empty'):
+        if not field:
+            md = md.checkmessage(options.getfieldvalue('message',
+                "field '%s' is empty" % fieldname))
+
+    #Check size
+    if options.exist('size'):
+        fieldsize=options.getfieldvalue('size')
+        if type(fieldsize) == str:
+            if m.strcmp(fieldsize,'universal'):
+
+                #Check that vector size will not be confusing for ModelProcessorx
+                if (md.mesh.numberofvertices==md.mesh.numberofelements):
+                    raise RuntimeError('number of vertices is the same as number of elements')
+                elif (md.mesh.numberofvertices+1==md.mesh.numberofelements):
+                    raise RuntimeError('number of vertices +1 is the same as number of elements')
+                elif (md.mesh.numberofvertices==md.mesh.numberofelements+1):
+                    raise RuntimeError('number of vertices is the same as number of elements +1')
+                
+                #Uniform field
+                if (np.size(field,0)==1):
+                    if (np.shape(field)[1]!=1):
+                        md = md.checkmessage(options.getfieldvalue('message',"field '{}' is not supported".format(fieldname)))
+
+                #vertex oriented input, only one column allowed
+                elif (np.shape(field)[0]==md.mesh.numberofvertices):
+                    if (np.shape(field)[1]!=1):
+                        md = md.checkmessage(options.getfieldvalue('message',"field '{}' is not supported".format(fieldname)))
+
+                #element oriented input, one or more column (patch) is ok 
+                elif (np.shape(field)[0]==md.mesh.numberofelements):
+                    pass
+                    #nothing to do here (either constant per element, or defined on nodes)
+
+                #vertex time series
+                elif (np.shape(field)[0]==md.mesh.numberofvertices+1):
+                    if (np.shape(field)[1]<=1):
+                        md = md.checkmessage(options.getfieldvalue('message',"field '{}' is not supported".format(fieldname)))
+
+                #element time series
+                elif (np.shape(field)[0]==md.mesh.numberofelements+1):
+                    if (np.shape(field)[1]<=1):
+                        md = md.checkmessage(options.getfieldvalue('message',"field '{}' is not supported".format(fieldname)))
+
+                #else not supported
+                else:
+                    md = md.checkmessage(options.getfieldvalue('message',"field '{}' is not supported".format(fieldname)))
+
+            else:
+                raise RuntimeError("fieldsize '{}' not supported yet".format(fieldsize))
+
+        else:
+            for i in range(np.size(fieldsize)):
+                if (not np.isnan(fieldsize[i])) and (np.shape(field)[i] != fieldsize[i]):
+                    md = md.checkmessage(options.getfieldvalue('message',"field {} dimension # {} should be of size {}".format(fieldname,i,fieldsize[i])))
+
+    #Check numel
+    if options.exist('numel'):
+        fieldnumel=options.getfieldvalue('numel')
+        if (type(fieldnumel) == int and np.size(field) != fieldnumel) or (type(fieldnumel) == list and np.size(field) not in fieldnumel):
+            if   len(fieldnumel)==1:
+                md = md.checkmessage(options.getfieldvalue('message',\
+                    "field '%s' size should be %d" % (fieldname,fieldnumel)))
+            elif len(fieldnumel)==2:
+                md = md.checkmessage(options.getfieldvalue('message',\
+                    "field '%s' size should be %d or %d" % (fieldname,fieldnumel[0],fieldnumel[1])))
+            else:
+                md = md.checkmessage(options.getfieldvalue('message',\
+                    "field '%s' size should be %s" % (fieldname,fieldnumel)))
+
+    #check NaN
+    if options.getfieldvalue('NaN',0):
+        if np.any(np.isnan(field)):
+            md = md.checkmessage(options.getfieldvalue('message',\
+                "NaN values found in field '%s'" % fieldname))
+
+
+    #check Inf
+    if options.getfieldvalue('Inf',0):
+        if np.any(np.isinf(field)):
+            md = md.checkmessage(options.getfieldvalue('message',\
+                "Inf values found in field '%s'" % fieldname))
+
+
+    #check cell
+    if options.getfieldvalue('cell',0):
+        if not isinstance(field,(tuple,list,dict)):
+            md = md.checkmessage(options.getfieldvalue('message',\
+                "field '%s' should be a cell" % fieldname))
+
+    #check values
+    if options.exist('values'):
+        fieldvalues=options.getfieldvalue('values')
+        if False in m.ismember(field,fieldvalues):
+            if   len(fieldvalues)==1:
+                md = md.checkmessage(options.getfieldvalue('message',\
+                    "field '%s' value should be '%s'"  % (fieldname,fieldvalues[0])))
+            elif len(fieldvalues)==2:
+                md = md.checkmessage(options.getfieldvalue('message',\
+                    "field '%s' values should be '%s' or '%s'"  % (fieldname,fieldvalues[0],fieldvalues[1])))
+            else:
+                md = md.checkmessage(options.getfieldvalue('message',\
+                    "field '%s' should have values in %s" % (fieldname,fieldvalues)))
+
+    #check greater
+    if options.exist('>='):
+        lowerbound = options.getfieldvalue('>=')
+        if type(lowerbound) is str:
+            lowerbound=attrgetter(lowerbound)(md)
+        if np.size(lowerbound)>1: #checking elementwise
+            if any(field<upperbound):
+                md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values below %d" % (fieldname,upperbound)))
+        else:
+            minval=np.nanmin(field)
+            if options.getfieldvalue('timeseries',0):
+                minval=np.nanmin(field[:-1])
+            elif options.getfieldvalue('singletimeseries',0):
+                if np.size(field)==1: #some singletimeseries are just one value
+                    minval=field
+                else:
+                    minval=np.nanmin(field[0])
+
+            if minval<lowerbound:
+                md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values above %d" % (fieldname,lowerbound)))
+
+    if options.exist('>'):
+        lowerbound=options.getfieldvalue('>')
+        if type(lowerbound) is str:
+            lowerbound=attrgetter(lowerbound)(md)
+        if np.size(lowerbound)>1: #checking elementwise
+            if any(field<=upperbound):
+                md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values below %d" % (fieldname,upperbound)))
+        else:
+            minval=np.nanmin(field)
+            if options.getfieldvalue('timeseries',0) :
+                minval=np.nanmin(field[:-1])
+            elif options.getfieldvalue('singletimeseries',0):
+                if np.size(field)==1: #some singletimeseries are just one value
+                    minval=field
+                else:
+                    minval=np.nanmin(field[0])
+
+            if minval<=lowerbound:
+                md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values above %d" % (fieldname,lowerbound)))
+
+    #check smaller
+    if options.exist('<='):
+        upperbound=options.getfieldvalue('<=')
+        if type(upperbound) is str:
+            upperbound=attrgetter(upperbound)(md)
+        if np.size(upperbound)>1: #checking elementwise
+            if any(field>upperbound):
+                md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values below %d" % (fieldname,upperbound)))
+        else:
+            maxval=np.nanmax(field)
+            if options.getfieldvalue('timeseries',0):
+                maxval=np.nanmax(field[:-1])
+            elif  options.getfieldvalue('singletimeseries',0):
+                if np.size(field)==1: #some singletimeseries are just one value
+                    maxval=field
+                else:
+                    maxval=np.nanmax(field[0])
+            elif hasattr(field, 'fov_forward_indices'):
+                maxval=field.fov_forward_indices[0]
+            if maxval>upperbound:
+                md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values below %d" % (fieldname,upperbound)))
+
+    if options.exist('<'):
+        upperbound=options.getfieldvalue('<')
+        if type(upperbound) is str:
+            upperbound=attrgetter(upperbound)(md)
+        if np.size(upperbound)>1: #checking elementwise
+            if any(field>=upperbound):
+                md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values below %d" % (fieldname,upperbound)))
+
+        else:
+            maxval=np.nanmax(field)
+            if options.getfieldvalue('timeseries',0):
+                maxval=np.nanmax(field[:-1])
+            elif options.getfieldvalue('singletimeseries',0):
+                if np.size(field)==1: #some singletimeseries are just one value
+                    maxval=field.copy()
+                else:
+                    maxval=np.nanmax(field[0])
+
+                if maxval>=upperbound:
+                    md = md.checkmessage(options.getfieldvalue('message',"field '%s' should have values below %d" % (fieldname,upperbound)))
+
+    #check file
+    if options.getfieldvalue('file',0):
+        if not os.path.exists(field):
+            md = md.checkmessage("file provided in '%s': '%s' does not exist" % (fieldname,field))
+
+    #Check row of strings
+    if options.exist('stringrow'):
+        if not isinstance(field,list):
+            md = md.checkmessage(options.getfieldvalue('message',\
+                    "field '%s' should be a list" %fieldname))
+
+    #Check forcings (size and times)
+    if options.getfieldvalue('timeseries',0):
+        if np.size(field,0)==md.mesh.numberofvertices or np.size(field,0)==md.mesh.numberofelements:
+            if np.ndim(field)>1 and not np.size(field,1)==1:
+                md = md.checkmessage(options.getfieldvalue('message',\
+                    "field '%s' should have only one column as there are md.mesh.numberofvertices lines" % fieldname))
+        elif np.size(field,0)==md.mesh.numberofvertices+1 or np.size(field,0)==md.mesh.numberofelements+1:
+            if np.ndim(field) > 1 and not all(field[-1,:]==np.sort(field[-1,:])):
+                md = md.checkmessage(options.getfieldvalue('message',\
+                    "field '%s' columns should be sorted chronologically" % fieldname))
+            if np.ndim(field) > 1 and any(field[-1,0:-1]==field[-1,1:]):
+                md = md.checkmessage(options.getfieldvalue('message',\
+                    "field '%s' columns must not contain duplicate timesteps" % fieldname))
+        else:
+            md = md.checkmessage(options.getfieldvalue('message',\
+                "field '%s' should have md.mesh.numberofvertices or md.mesh.numberofvertices+1 lines" % fieldname))
+
+    #Check single value forcings (size and times)
+    if options.getfieldvalue('singletimeseries',0):
+        if np.size(field,0)==2:
+            if not all(field[-1,:]==np.sort(field[-1,:])):
+                md = md.checkmessage(options.getfieldvalue('message',\
+                        "field '%s' columns should be sorted chronologically" % fieldname))
+            if any(field[-1,0:-1]==field[-1,1:]):
+                md = md.checkmessage(options.getfieldvalue('message',\
+                        "field '%s' columns must not contain duplicate timesteps" % fieldname))
+        elif np.size(field,0) == 1:
+            if np.ndim(field) > 1 and not np.size(field,1) == 1:
+                md = md.checkmessage(options.getfieldvalue('message',\
+                "field '%s' should be either a scalar or have 2 lines" % fieldname))
+        else:
+                md = md.checkmessage(options.getfieldvalue('message',\
+                "field '%s' should have 2 lines or be a scalar" % fieldname))
+
+    return md
