Index: /issm/trunk/src/c/Container/Inputs.cpp
===================================================================
--- /issm/trunk/src/c/Container/Inputs.cpp	(revision 5658)
+++ /issm/trunk/src/c/Container/Inputs.cpp	(revision 5659)
@@ -411,4 +411,88 @@
 }
 /*}}}*/
+/*FUNCTION Inputs::Max{{{1*/
+double Inputs::Max(int enumtype){
+
+	/*Output*/
+	double max;
+
+	/*Get input*/
+	Input* input=(Input*)this->GetInput(enumtype);
+
+	/*Apply ContrainMin: */
+	if (input){
+		max=input->Max();
+	}
+	else{
+		ISSMERROR("Input %s not found",EnumToString(enumtype));
+	}
+
+	/*Return output*/
+	return max;
+}
+/*}}}*/
+/*FUNCTION Inputs::MaxAbs{{{1*/
+double Inputs::MaxAbs(int enumtype){
+
+	/*Output*/
+	double max;
+
+	/*Get input*/
+	Input* input=(Input*)this->GetInput(enumtype);
+
+	/*Apply ContrainMin: */
+	if (input){
+		max=input->MaxAbs();
+	}
+	else{
+		ISSMERROR("Input %s not found",EnumToString(enumtype));
+	}
+
+	/*Return output*/
+	return max;
+}
+/*}}}*/
+/*FUNCTION Inputs::Min{{{1*/
+double Inputs::Min(int enumtype){
+
+	/*Output*/
+	double min;
+
+	/*Get input*/
+	Input* input=(Input*)this->GetInput(enumtype);
+
+	/*Apply ContrainMin: */
+	if (input){
+		min=input->Min();
+	}
+	else{
+		ISSMERROR("Input %s not found",EnumToString(enumtype));
+	}
+
+	/*Return output*/
+	return min;
+}
+/*}}}*/
+/*FUNCTION Inputs::MinAbs{{{1*/
+double Inputs::MinAbs(int enumtype){
+
+	/*Output*/
+	double min;
+
+	/*Get input*/
+	Input* input=(Input*)this->GetInput(enumtype);
+
+	/*Apply ContrainMin: */
+	if (input){
+		min=input->MinAbs();
+	}
+	else{
+		ISSMERROR("Input %s not found",EnumToString(enumtype));
+	}
+
+	/*Return output*/
+	return min;
+}
+/*}}}*/
 /*FUNCTION Inputs::GetInput{{{1*/
 Input* Inputs::GetInput(int enum_name){
Index: /issm/trunk/src/c/Container/Inputs.h
===================================================================
--- /issm/trunk/src/c/Container/Inputs.h	(revision 5658)
+++ /issm/trunk/src/c/Container/Inputs.h	(revision 5659)
@@ -38,4 +38,8 @@
 		void    AXPY(int YEnum, double scalar, int XEnum);
 		double  InfinityNorm(int enumtype);
+		double  Max(int enumtype);
+		double  MaxAbs(int enumtype);
+		double  Min(int enumtype);
+		double  MinAbs(int enumtype);
 		
 		void GetParameterAverage(double* pvalue, int enum_type);
Index: /issm/trunk/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 5658)
+++ /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 5659)
@@ -1314,25 +1314,9 @@
 void  Penta::MaxAbsVx(double* pmaxabsvx, bool process_units){
 
-	int i;
-	int dim;
-	const int numgrids=6;
-	double  gaussgrids[numgrids][4]={{1,0,0,-1},{0,1,0,-1},{0,0,1,-1},{1,0,0,1},{0,1,0,1},{0,0,1,1}};
-	double  vx_values[numgrids];
-	double  maxabsvx;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vx_values[0],&gaussgrids[0][0],numgrids,VxEnum);
+	/*Get maximum:*/
+	double maxabsvx=this->inputs->MaxAbs(VxEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
-
-	/*now, compute maximum:*/
-	maxabsvx=fabs(vx_values[0]);
-	for(i=1;i<numgrids;i++){
-		if (fabs(vx_values[i])>maxabsvx)maxabsvx=fabs(vx_values[i]);
-	}
+	if(process_units) maxabsvx=UnitConversion(maxabsvx,IuToExtEnum,VxEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1343,25 +1327,9 @@
 void  Penta::MaxAbsVy(double* pmaxabsvy, bool process_units){
 
-	int i;
-	int dim;
-	const int numgrids=6;
-	double  gaussgrids[numgrids][4]={{1,0,0,-1},{0,1,0,-1},{0,0,1,-1},{1,0,0,1},{0,1,0,1},{0,0,1,1}};
-	double  vy_values[numgrids];
-	double  maxabsvy;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vy_values[0],&gaussgrids[0][0],numgrids,VyEnum);
+	/*Get maximum:*/
+	double maxabsvy=this->inputs->MaxAbs(VyEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
-
-	/*now, compute maximum:*/
-	maxabsvy=fabs(vy_values[0]);
-	for(i=1;i<numgrids;i++){
-		if (fabs(vy_values[i])>maxabsvy)maxabsvy=fabs(vy_values[i]);
-	}
+	if(process_units) maxabsvy=UnitConversion(maxabsvy,IuToExtEnum,VyEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1372,25 +1340,9 @@
 void  Penta::MaxAbsVz(double* pmaxabsvz, bool process_units){
 
-	int i;
-	int dim;
-	const int numgrids=6;
-	double  gaussgrids[numgrids][4]={{1,0,0,-1},{0,1,0,-1},{0,0,1,-1},{1,0,0,1},{0,1,0,1},{0,0,1,1}};
-	double  vz_values[numgrids];
-	double  maxabsvz;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vz_values[0],&gaussgrids[0][0],numgrids,VzEnum);
+	/*Get maximum:*/
+	double maxabsvz=this->inputs->MaxAbs(VzEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
-
-	/*now, compute maximum:*/
-	maxabsvz=fabs(vz_values[0]);
-	for(i=1;i<numgrids;i++){
-		if (fabs(vz_values[i])>maxabsvz)maxabsvz=fabs(vz_values[i]);
-	}
+	if(process_units) maxabsvz=UnitConversion(maxabsvz,IuToExtEnum,VyEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1401,25 +1353,9 @@
 void  Penta::MaxVel(double* pmaxvel, bool process_units){
 
-	int i;
-	int dim;
-	const int numgrids=6;
-	double  gaussgrids[numgrids][4]={{1,0,0,-1},{0,1,0,-1},{0,0,1,-1},{1,0,0,1},{0,1,0,1},{0,0,1,1}};
-	double  vel_values[numgrids];
-	double  maxvel;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vel_values[0],&gaussgrids[0][0],numgrids,VelEnum);
+	/*Get maximum:*/
+	double maxvel=this->inputs->Max(VelEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vel_values[0],numgrids,IuToExtEnum,VelEnum,this->parameters);
-
-	/*now, compute maximum:*/
-	maxvel=vel_values[0];
-	for(i=1;i<numgrids;i++){
-		if (vel_values[i]>maxvel)maxvel=vel_values[i];
-	}
+	if(process_units) maxvel=UnitConversion(maxvel,IuToExtEnum,VelEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1431,25 +1367,9 @@
 void  Penta::MaxVx(double* pmaxvx, bool process_units){
 
-	int i;
-	int dim;
-	const int numgrids=6;
-	double  gaussgrids[numgrids][4]={{1,0,0,-1},{0,1,0,-1},{0,0,1,-1},{1,0,0,1},{0,1,0,1},{0,0,1,1}};
-	double  vx_values[numgrids];
-	double  maxvx;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vx_values[0],&gaussgrids[0][0],numgrids,VxEnum);
+	/*Get maximum:*/
+	double maxvx=this->inputs->Max(VxEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
-
-	/*now, compute maximum:*/
-	maxvx=vx_values[0];
-	for(i=1;i<numgrids;i++){
-		if (vx_values[i]>maxvx)maxvx=vx_values[i];
-	}
+	if(process_units) maxvx=UnitConversion(maxvx,IuToExtEnum,VxEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1461,25 +1381,9 @@
 void  Penta::MaxVy(double* pmaxvy, bool process_units){
 
-	int i;
-	int dim;
-	const int numgrids=6;
-	double  gaussgrids[numgrids][4]={{1,0,0,-1},{0,1,0,-1},{0,0,1,-1},{1,0,0,1},{0,1,0,1},{0,0,1,1}};
-	double  vy_values[numgrids];
-	double  maxvy;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vy_values[0],&gaussgrids[0][0],numgrids,VyEnum);
+	/*Get maximum:*/
+	double maxvy=this->inputs->Max(VyEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
-
-	/*now, compute maximum:*/
-	maxvy=vy_values[0];
-	for(i=1;i<numgrids;i++){
-		if (vy_values[i]>maxvy)maxvy=vy_values[i];
-	}
+	if(process_units) maxvy=UnitConversion(maxvy,IuToExtEnum,VyEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1491,25 +1395,9 @@
 void  Penta::MaxVz(double* pmaxvz, bool process_units){
 
-	int i;
-	int dim;
-	const int numgrids=6;
-	double  gaussgrids[numgrids][4]={{1,0,0,-1},{0,1,0,-1},{0,0,1,-1},{1,0,0,1},{0,1,0,1},{0,0,1,1}};
-	double  vz_values[numgrids];
-	double  maxvz;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vz_values[0],&gaussgrids[0][0],numgrids,VzEnum);
+	/*Get maximum:*/
+	double maxvz=this->inputs->Max(VzEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
-
-	/*now, compute maximum:*/
-	maxvz=vz_values[0];
-	for(i=1;i<numgrids;i++){
-		if (vz_values[i]>maxvz)maxvz=vz_values[i];
-	}
+	if(process_units) maxvz=UnitConversion(maxvz,IuToExtEnum,VzEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1521,25 +1409,9 @@
 void  Penta::MinVel(double* pminvel, bool process_units){
 
-	int i;
-	int dim;
-	const int numgrids=6;
-	double  gaussgrids[numgrids][4]={{1,0,0,-1},{0,1,0,-1},{0,0,1,-1},{1,0,0,1},{0,1,0,1},{0,0,1,1}};
-	double  vel_values[numgrids];
-	double  minvel;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vel_values[0],&gaussgrids[0][0],numgrids,VelEnum);
+	/*Get minimum:*/
+	double minvel=this->inputs->Min(VelEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vel_values[0],numgrids,IuToExtEnum,VelEnum,this->parameters);
-
-	/*now, compute minimum:*/
-	minvel=vel_values[0];
-	for(i=1;i<numgrids;i++){
-		if (vel_values[i]<minvel)minvel=vel_values[i];
-	}
+	if(process_units) minvel=UnitConversion(minvel,IuToExtEnum,VelEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1551,25 +1423,9 @@
 void  Penta::MinVx(double* pminvx, bool process_units){
 
-	int i;
-	int dim;
-	const int numgrids=6;
-	double  gaussgrids[numgrids][4]={{1,0,0,-1},{0,1,0,-1},{0,0,1,-1},{1,0,0,1},{0,1,0,1},{0,0,1,1}};
-	double  vx_values[numgrids];
-	double  minvx;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vx_values[0],&gaussgrids[0][0],numgrids,VxEnum);
+	/*Get minimum:*/
+	double minvx=this->inputs->Min(VxEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
-
-	/*now, compute minimum:*/
-	minvx=vx_values[0];
-	for(i=1;i<numgrids;i++){
-		if (vx_values[i]<minvx)minvx=vx_values[i];
-	}
+	if(process_units) minvx=UnitConversion(minvx,IuToExtEnum,VxEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1581,25 +1437,9 @@
 void  Penta::MinVy(double* pminvy, bool process_units){
 
-	int i;
-	int dim;
-	const int numgrids=6;
-	double  gaussgrids[numgrids][4]={{1,0,0,-1},{0,1,0,-1},{0,0,1,-1},{1,0,0,1},{0,1,0,1},{0,0,1,1}};
-	double  vy_values[numgrids];
-	double  minvy;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vy_values[0],&gaussgrids[0][0],numgrids,VyEnum);
+	/*Get minimum:*/
+	double minvy=this->inputs->Min(VyEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
-
-	/*now, compute minimum:*/
-	minvy=vy_values[0];
-	for(i=1;i<numgrids;i++){
-		if (vy_values[i]<minvy)minvy=vy_values[i];
-	}
+	if(process_units) minvy=UnitConversion(minvy,IuToExtEnum,VyEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1611,25 +1451,9 @@
 void  Penta::MinVz(double* pminvz, bool process_units){
 
-	int i;
-	int dim;
-	const int numgrids=6;
-	double  gaussgrids[numgrids][4]={{1,0,0,-1},{0,1,0,-1},{0,0,1,-1},{1,0,0,1},{0,1,0,1},{0,0,1,1}};
-	double  vz_values[numgrids];
-	double  minvz;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vz_values[0],&gaussgrids[0][0],numgrids,VzEnum);
+	/*Get minimum:*/
+	double minvz=this->inputs->Min(VzEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
-
-	/*now, compute minimum:*/
-	minvz=vz_values[0];
-	for(i=1;i<numgrids;i++){
-		if (vz_values[i]<minvz)minvz=vz_values[i];
-	}
+	if(process_units) minvz=UnitConversion(minvz,IuToExtEnum,VzEnum,this->parameters);
 
 	/*Assign output pointers:*/
Index: /issm/trunk/src/c/objects/Elements/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 5658)
+++ /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 5659)
@@ -1424,24 +1424,9 @@
 void  Tria::MaxAbsVx(double* pmaxabsvx, bool process_units){
 
-	int i;
-	int dim;
-	const int numvertices=3;
-	double  vx_values[numvertices];
-	double  maxabsvx;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	GetParameterListOnVertices(&vx_values[0],VxEnum);
+	/*Get maximum:*/
+	double maxabsvx=this->inputs->MaxAbs(VxEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vx_values[0],numvertices,IuToExtEnum,VxEnum,this->parameters);
-
-	/*now, compute maximum:*/
-	maxabsvx=fabs(vx_values[0]);
-	for(i=1;i<numvertices;i++){
-		if (fabs(vx_values[i])>maxabsvx)maxabsvx=fabs(vx_values[i]);
-	}
+	if(process_units) maxabsvx=UnitConversion(maxabsvx,IuToExtEnum,VxEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1452,24 +1437,9 @@
 void  Tria::MaxAbsVy(double* pmaxabsvy, bool process_units){
 
-	int i;
-	int dim;
-	const int numvertices=3;
-	double  vy_values[numvertices];
-	double  maxabsvy;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	GetParameterListOnVertices(&vy_values[0],VyEnum);
+	/*Get maximum:*/
+	double maxabsvy=this->inputs->MaxAbs(VyEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vy_values[0],numvertices,IuToExtEnum,VyEnum,this->parameters);
-
-	/*now, compute maximum:*/
-	maxabsvy=fabs(vy_values[0]);
-	for(i=1;i<numvertices;i++){
-		if (fabs(vy_values[i])>maxabsvy)maxabsvy=fabs(vy_values[i]);
-	}
+	if(process_units) maxabsvy=UnitConversion(maxabsvy,IuToExtEnum,VyEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1480,24 +1450,9 @@
 void  Tria::MaxAbsVz(double* pmaxabsvz, bool process_units){
 
-	int i;
-	int dim;
-	const int numvertices=3;
-	double  vz_values[numvertices];
-	double  maxabsvz;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	GetParameterListOnVertices(&vz_values[0],VzEnum);
+	/*Get maximum:*/
+	double maxabsvz=this->inputs->MaxAbs(VzEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vz_values[0],numvertices,IuToExtEnum,VzEnum,this->parameters);
-
-	/*now, compute maximum:*/
-	maxabsvz=fabs(vz_values[0]);
-	for(i=1;i<numvertices;i++){
-		if (fabs(vz_values[i])>maxabsvz)maxabsvz=fabs(vz_values[i]);
-	}
+	if(process_units) maxabsvz=UnitConversion(maxabsvz,IuToExtEnum,VyEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1508,24 +1463,9 @@
 void  Tria::MaxVel(double* pmaxvel, bool process_units){
 
-	int i;
-	int dim;
-	const int numvertices=3;
-	double  vel_values[numvertices];
-	double  maxvel;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	GetParameterListOnVertices(&vel_values[0],VelEnum);
+	/*Get maximum:*/
+	double maxvel=this->inputs->Max(VelEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vel_values[0],numvertices,IuToExtEnum,VelEnum,this->parameters);
-
-	/*now, compute maximum:*/
-	maxvel=vel_values[0];
-	for(i=1;i<numvertices;i++){
-		if (vel_values[i]>maxvel)maxvel=vel_values[i];
-	}
+	if(process_units) maxvel=UnitConversion(maxvel,IuToExtEnum,VelEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1537,24 +1477,9 @@
 void  Tria::MaxVx(double* pmaxvx, bool process_units){
 
-	int i;
-	int dim;
-	const int numvertices=3;
-	double  vx_values[numvertices];
-	double  maxvx;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	GetParameterListOnVertices(&vx_values[0],VxEnum);
+	/*Get maximum:*/
+	double maxvx=this->inputs->Max(VxEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vx_values[0],numvertices,IuToExtEnum,VxEnum,this->parameters);
-
-	/*now, compute maximum:*/
-	maxvx=vx_values[0];
-	for(i=1;i<numvertices;i++){
-		if (vx_values[i]>maxvx)maxvx=vx_values[i];
-	}
+	if(process_units) maxvx=UnitConversion(maxvx,IuToExtEnum,VxEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1566,24 +1491,9 @@
 void  Tria::MaxVy(double* pmaxvy, bool process_units){
 
-	int i;
-	int dim;
-	const int numvertices=3;
-	double  vy_values[numvertices];
-	double  maxvy;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	GetParameterListOnVertices(&vy_values[0],VyEnum);
+	/*Get maximum:*/
+	double maxvy=this->inputs->Max(VyEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vy_values[0],numvertices,IuToExtEnum,VyEnum,this->parameters);
-
-	/*now, compute maximum:*/
-	maxvy=vy_values[0];
-	for(i=1;i<numvertices;i++){
-		if (vy_values[i]>maxvy)maxvy=vy_values[i];
-	}
+	if(process_units) maxvy=UnitConversion(maxvy,IuToExtEnum,VyEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1595,24 +1505,9 @@
 void  Tria::MaxVz(double* pmaxvz, bool process_units){
 
-	int i;
-	int dim;
-	const int numvertices=3;
-	double  vz_values[numvertices];
-	double  maxvz;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	GetParameterListOnVertices(&vz_values[0],VzEnum);
+	/*Get maximum:*/
+	double maxvz=this->inputs->Max(VzEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vz_values[0],numvertices,IuToExtEnum,VzEnum,this->parameters);
-
-	/*now, compute maximum:*/
-	maxvz=vz_values[0];
-	for(i=1;i<numvertices;i++){
-		if (vz_values[i]>maxvz)maxvz=vz_values[i];
-	}
+	if(process_units) maxvz=UnitConversion(maxvz,IuToExtEnum,VzEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1624,24 +1519,9 @@
 void  Tria::MinVel(double* pminvel, bool process_units){
 
-	int i;
-	int dim;
-	const int numvertices=3;
-	double  vel_values[numvertices];
-	double  minvel;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	GetParameterListOnVertices(&vel_values[0],VelEnum);
+	/*Get minimum:*/
+	double minvel=this->inputs->Min(VelEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vel_values[0],numvertices,IuToExtEnum,VelEnum,this->parameters);
-
-	/*now, compute minimum:*/
-	minvel=vel_values[0];
-	for(i=1;i<numvertices;i++){
-		if (vel_values[i]<minvel)minvel=vel_values[i];
-	}
+	if(process_units) minvel=UnitConversion(minvel,IuToExtEnum,VelEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1653,24 +1533,9 @@
 void  Tria::MinVx(double* pminvx, bool process_units){
 
-	int i;
-	int dim;
-	const int numvertices=3;
-	double  vx_values[numvertices];
-	double  minvx;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	GetParameterListOnVertices(&vx_values[0],VxEnum);
+	/*Get minimum:*/
+	double minvx=this->inputs->Min(VxEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vx_values[0],numvertices,IuToExtEnum,VxEnum,this->parameters);
-
-	/*now, compute minimum:*/
-	minvx=vx_values[0];
-	for(i=1;i<numvertices;i++){
-		if (vx_values[i]<minvx)minvx=vx_values[i];
-	}
+	if(process_units) minvx=UnitConversion(minvx,IuToExtEnum,VxEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1682,24 +1547,9 @@
 void  Tria::MinVy(double* pminvy, bool process_units){
 
-	int i;
-	int dim;
-	const int numvertices=3;
-	double  vy_values[numvertices];
-	double  minvy;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	GetParameterListOnVertices(&vy_values[0],VyEnum);
+	/*Get minimum:*/
+	double minvy=this->inputs->Min(VyEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vy_values[0],numvertices,IuToExtEnum,VyEnum,this->parameters);
-
-	/*now, compute minimum:*/
-	minvy=vy_values[0];
-	for(i=1;i<numvertices;i++){
-		if (vy_values[i]<minvy)minvy=vy_values[i];
-	}
+	if(process_units) minvy=UnitConversion(minvy,IuToExtEnum,VyEnum,this->parameters);
 
 	/*Assign output pointers:*/
@@ -1711,24 +1561,9 @@
 void  Tria::MinVz(double* pminvz, bool process_units){
 
-	int i;
-	int dim;
-	const int numvertices=3;
-	double  vz_values[numvertices];
-	double  minvz;
-
-	/*retrieve dim parameter: */
-	parameters->FindParam(&dim,DimEnum);
-
-	/*retrive velocity values at nodes */
-	GetParameterListOnVertices(&vz_values[0],VzEnum);
+	/*Get minimum:*/
+	double minvz=this->inputs->Min(VzEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vz_values[0],numvertices,IuToExtEnum,VzEnum,this->parameters);
-
-	/*now, compute minimum:*/
-	minvz=vz_values[0];
-	for(i=1;i<numvertices;i++){
-		if (vz_values[i]<minvz)minvz=vz_values[i];
-	}
+	if(process_units) minvz=UnitConversion(minvz,IuToExtEnum,VzEnum,this->parameters);
 
 	/*Assign output pointers:*/
Index: /issm/trunk/src/c/objects/Inputs/BoolInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/BoolInput.h	(revision 5658)
+++ /issm/trunk/src/c/objects/Inputs/BoolInput.h	(revision 5659)
@@ -73,4 +73,8 @@
 		void ConstrainMin(double minimum){ISSMERROR("not implemented yet");};
 		double InfinityNorm(void){ISSMERROR("InfinityNorm not implemented for booleans");};
+		double Max(void){ISSMERROR("Max not implemented for booleans");};
+		double MaxAbs(void){ISSMERROR("Max not implemented for booleans");};
+		double Min(void){ISSMERROR("Min not implemented for booleans");};
+		double MinAbs(void){ISSMERROR("Min not implemented for booleans");};
 		void Scale(double scale_factor);
 		void ArtificialNoise(double min,double max){ISSMERROR("not implemented yet");};
Index: /issm/trunk/src/c/objects/Inputs/DoubleInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/DoubleInput.cpp	(revision 5658)
+++ /issm/trunk/src/c/objects/Inputs/DoubleInput.cpp	(revision 5659)
@@ -251,4 +251,24 @@
 }
 /*}}}*/
+/*FUNCTION DoubleInput::Max{{{1*/
+double DoubleInput::Max(void){
+	return this->value;
+}
+/*}}}*/
+/*FUNCTION DoubleInput::MaxAbs{{{1*/
+double DoubleInput::MaxAbs(void){
+	return fabs(this->value);
+}
+/*}}}*/
+/*FUNCTION DoubleInput::Min{{{1*/
+double DoubleInput::Min(void){
+	return this->value;
+}
+/*}}}*/
+/*FUNCTION DoubleInput::MinAbs{{{1*/
+double DoubleInput::MinAbs(void){
+	return fabs(this->value);
+}
+/*}}}*/
 /*FUNCTION DoubleInput::GetVectorFromInputs{{{1*/
 void DoubleInput::GetVectorFromInputs(Vec vector,int* doflist){
Index: /issm/trunk/src/c/objects/Inputs/DoubleInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/DoubleInput.h	(revision 5658)
+++ /issm/trunk/src/c/objects/Inputs/DoubleInput.h	(revision 5659)
@@ -76,4 +76,8 @@
 		void Constrain(double cm_min, double cm_max);
 		double InfinityNorm(void){ISSMERROR("not implemented yet");};
+		double Max(void);
+		double MaxAbs(void);
+		double Min(void);
+		double MinAbs(void);
 		void Extrude(void){ISSMERROR("not supported yet");};
 		void VerticallyIntegrate(Input* thickness_input);
Index: /issm/trunk/src/c/objects/Inputs/Input.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/Input.h	(revision 5658)
+++ /issm/trunk/src/c/objects/Inputs/Input.h	(revision 5659)
@@ -49,15 +49,19 @@
 		virtual void ChangeEnum(int newenumtype)=0;
 
-		virtual void SquareMin(double* psquaremin, bool process_units,Parameters* parameters)=0;
-		virtual void ConstrainMin(double minimum)=0;
+		virtual void   SquareMin(double* psquaremin, bool process_units,Parameters* parameters)=0;
+		virtual void   ConstrainMin(double minimum)=0;
 		virtual double InfinityNorm(void)=0;
-		virtual void Scale(double scale_factor)=0;
-		virtual void ArtificialNoise(double min,double max)=0;
-		virtual void AXPY(Input* xinput,double scalar)=0;
-		virtual void Constrain(double cm_min, double cm_max)=0;
-		virtual void VerticallyIntegrate(Input* thickness_input)=0;
-		virtual void Extrude()=0;
-		virtual void GetVectorFromInputs(Vec vector,int* doflist)=0;
-		virtual void GetValuesPtr(double** pvalues,int* pnum_values)=0;
+		virtual double MaxAbs(void)=0;
+		virtual double MinAbs(void)=0;
+		virtual double Max(void)=0;
+		virtual double Min(void)=0;
+		virtual void   Scale(double scale_factor)=0;
+		virtual void   ArtificialNoise(double min,double max)=0;
+		virtual void   AXPY(Input* xinput,double scalar)=0;
+		virtual void   Constrain(double cm_min, double cm_max)=0;
+		virtual void   VerticallyIntegrate(Input* thickness_input)=0;
+		virtual void   Extrude()=0;
+		virtual void   GetVectorFromInputs(Vec vector,int* doflist)=0;
+		virtual void   GetValuesPtr(double** pvalues,int* pnum_values)=0;
 		
 		virtual Input* SpawnTriaInput(int* indices)=0;
Index: /issm/trunk/src/c/objects/Inputs/IntInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/IntInput.h	(revision 5658)
+++ /issm/trunk/src/c/objects/Inputs/IntInput.h	(revision 5659)
@@ -77,4 +77,8 @@
 		void Constrain(double cm_min, double cm_max);
 		double InfinityNorm(void){ISSMERROR("InfinityNorm not implemented for integers");};
+		double Max(void){ISSMERROR("Max not implemented for integers");};
+		double MaxAbs(void){ISSMERROR("Max not implemented for integers");};
+		double Min(void){ISSMERROR("Min not implemented for integers");};
+		double MinAbs(void){ISSMERROR("Min not implemented for integers");};
 		void Extrude(void){ISSMERROR("not supported yet");};
 		void VerticallyIntegrate(Input* thickness_input){ISSMERROR("not supported yet");};
Index: /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp	(revision 5658)
+++ /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp	(revision 5659)
@@ -650,4 +650,52 @@
 }
 /*}}}*/
+/*FUNCTION PentaVertexInput::Max{{{1*/
+double PentaVertexInput::Max(void){
+
+	const int numgrids=6;
+	double    max=values[0];
+
+	for(int i=1;i<numgrids;i++){
+		if(values[i]>max) max=values[i];
+	}
+	return max;
+}
+/*}}}*/
+/*FUNCTION PentaVertexInput::MaxAbs{{{1*/
+double PentaVertexInput::MaxAbs(void){
+
+	const int numgrids=6;
+	double    max=fabs(values[0]);
+
+	for(int i=1;i<numgrids;i++){
+		if(fabs(values[i])>max) max=fabs(values[i]);
+	}
+	return max;
+}
+/*}}}*/
+/*FUNCTION PentaVertexInput::Min{{{1*/
+double PentaVertexInput::Min(void){
+
+	const int numgrids=6;
+	double    min=values[0];
+
+	for(int i=1;i<numgrids;i++){
+		if(values[i]<min) min=values[i];
+	}
+	return min;
+}
+/*}}}*/
+/*FUNCTION PentaVertexInput::MinAbs{{{1*/
+double PentaVertexInput::MinAbs(void){
+
+	const int numgrids=6;
+	double    min=fabs(values[0]);
+
+	for(int i=1;i<numgrids;i++){
+		if(fabs(values[i])<min) min=fabs(values[i]);
+	}
+	return min;
+}
+/*}}}*/
 /*FUNCTION PentaVertexInput::Scale{{{1*/
 void PentaVertexInput::Scale(double scale_factor){
Index: /issm/trunk/src/c/objects/Inputs/PentaVertexInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/PentaVertexInput.h	(revision 5658)
+++ /issm/trunk/src/c/objects/Inputs/PentaVertexInput.h	(revision 5659)
@@ -78,4 +78,8 @@
 		void Constrain(double cm_min, double cm_max);
 		double InfinityNorm(void);
+		double Max(void);
+		double MaxAbs(void);
+		double Min(void);
+		double MinAbs(void);
 		void Extrude(void);
 		void VerticallyIntegrate(Input* thickness_input);
Index: /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp	(revision 5658)
+++ /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp	(revision 5659)
@@ -364,4 +364,52 @@
 }
 /*}}}*/
+/*FUNCTION TriaVertexInput::Max{{{1*/
+double TriaVertexInput::Max(void){
+
+	const int numgrids=3;
+	double    max=values[0];
+
+	for(int i=1;i<numgrids;i++){
+		if(values[i]>max) max=values[i];
+	}
+	return max;
+}
+/*}}}*/
+/*FUNCTION TriaVertexInput::MaxAbs{{{1*/
+double TriaVertexInput::MaxAbs(void){
+
+	const int numgrids=3;
+	double    max=fabs(values[0]);
+
+	for(int i=1;i<numgrids;i++){
+		if(fabs(values[i])>max) max=fabs(values[i]);
+	}
+	return max;
+}
+/*}}}*/
+/*FUNCTION TriaVertexInput::Min{{{1*/
+double TriaVertexInput::Min(void){
+
+	const int numgrids=3;
+	double    min=values[0];
+
+	for(int i=1;i<numgrids;i++){
+		if(values[i]<min) min=values[i];
+	}
+	return min;
+}
+/*}}}*/
+/*FUNCTION TriaVertexInput::MinAbs{{{1*/
+double TriaVertexInput::MinAbs(void){
+
+	const int numgrids=3;
+	double    min=fabs(values[0]);
+
+	for(int i=1;i<numgrids;i++){
+		if(fabs(values[i])<min) min=fabs(values[i]);
+	}
+	return min;
+}
+/*}}}*/
 /*FUNCTION TriaVertexInput::Scale{{{1*/
 void TriaVertexInput::Scale(double scale_factor){
Index: /issm/trunk/src/c/objects/Inputs/TriaVertexInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/TriaVertexInput.h	(revision 5658)
+++ /issm/trunk/src/c/objects/Inputs/TriaVertexInput.h	(revision 5659)
@@ -78,4 +78,8 @@
 		void Constrain(double cm_min, double cm_max);
 		double InfinityNorm(void);
+		double Max(void);
+		double MaxAbs(void);
+		double Min(void);
+		double MinAbs(void);
 		void Extrude(void){ISSMERROR("not supported yet");};
 		void VerticallyIntegrate(Input* thickness_input){ISSMERROR("not supported yet");};
Index: /issm/trunk/src/c/shared/Numerics/UnitConversion.cpp
===================================================================
--- /issm/trunk/src/c/shared/Numerics/UnitConversion.cpp	(revision 5658)
+++ /issm/trunk/src/c/shared/Numerics/UnitConversion.cpp	(revision 5659)
@@ -59,13 +59,13 @@
 	double scale;
 	switch(type_enum){
-		case VxEnum:   scale=yts;break; //m/yr
-		case VxObsEnum:   scale=yts;break; //m/yr
-		case VyEnum:   scale=yts;break; //m/yr
-		case VyObsEnum:   scale=yts;break; //m/yr
-		case VzEnum:   scale=yts;break; //m/yr
-		case VzObsEnum:   scale=yts;break; //m/yr
-		case VelEnum:  scale=yts;break; //m/yr
-		case VelObsEnum:  scale=yts;break; //m/yr
-		case DhDtEnum: scale=yts;break; //m/yr
+		case VxEnum:          scale=yts;break; //m/yr
+		case VxObsEnum:       scale=yts;break; //m/yr
+		case VyEnum:          scale=yts;break; //m/yr
+		case VyObsEnum:       scale=yts;break; //m/yr
+		case VzEnum:          scale=yts;break; //m/yr
+		case VzObsEnum:       scale=yts;break; //m/yr
+		case VelEnum:         scale=yts;break; //m/yr
+		case VelObsEnum:      scale=yts;break; //m/yr
+		case DhDtEnum:        scale=yts;break; //m/yr
 		case MeltingRateEnum: scale=yts;break; //m/yr
 		case MisfitEnum:      scale=pow(yts,2);break; //(m/yr)^2
