Index: /issm/trunk/src/c/Makefile.am
===================================================================
--- /issm/trunk/src/c/Makefile.am	(revision 5528)
+++ /issm/trunk/src/c/Makefile.am	(revision 5529)
@@ -107,5 +107,4 @@
 					./objects/IoModel.cpp\
 					./objects/ElementResults/ElementResultLocal.h\
-					./objects/ElementResults/NodalValuesUnitConversion.cpp\
 					./objects/ElementResults/DoubleElementResult.h\
 					./objects/ElementResults/DoubleElementResult.cpp\
@@ -244,4 +243,5 @@
 					./shared/Numerics/OptFunc.cpp\
 					./shared/Numerics/extrema.cpp\
+					./shared/Numerics/UnitConversion.cpp\
 					./shared/Exceptions/exceptions.h\
 					./shared/Exceptions/Exceptions.cpp\
@@ -661,5 +661,4 @@
 					./objects/Patch.cpp\
 					./objects/ElementResults/ElementResultLocal.h\
-					./objects/ElementResults/NodalValuesUnitConversion.cpp\
 					./objects/ElementResults/DoubleElementResult.h\
 					./objects/ElementResults/DoubleElementResult.cpp\
@@ -796,4 +795,5 @@
 					./shared/Numerics/OptFunc.cpp\
 					./shared/Numerics/extrema.cpp\
+					./shared/Numerics/UnitConversion.cpp\
 					./shared/Exceptions/exceptions.h\
 					./shared/Exceptions/Exceptions.cpp\
Index: /issm/trunk/src/c/modules/ModelProcessorx/Qmu/CreateParametersQmu.cpp
===================================================================
--- /issm/trunk/src/c/modules/ModelProcessorx/Qmu/CreateParametersQmu.cpp	(revision 5528)
+++ /issm/trunk/src/c/modules/ModelProcessorx/Qmu/CreateParametersQmu.cpp	(revision 5529)
@@ -153,5 +153,8 @@
 				/*Recover data: */
 				IoModelFetchData(&dakota_parameter,NULL,NULL,iomodel_handle,EnumToModelField(StringToEnum(tag)));
-					
+
+				/*Convert units: */
+				UnitConversion(dakota_parameter,iomodel->numberofvertices,ExtToIuEnum,StringToEnum(tag),parameters);
+
 				/*Add to parameters: */
 				parameters->AddObject(new DoubleVecParam(StringToEnum(tag),dakota_parameter,iomodel->numberofvertices));
Index: /issm/trunk/src/c/objects/ElementResults/DoubleElementResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ElementResults/DoubleElementResult.cpp	(revision 5528)
+++ /issm/trunk/src/c/objects/ElementResults/DoubleElementResult.cpp	(revision 5529)
@@ -162,5 +162,5 @@
 void DoubleElementResult::ProcessUnits(Parameters* parameters){
 	
-	NodalValuesUnitConversion(&this->value,1,this->enum_type,parameters);
+	this->value=UnitConversion(this->value,IuToExtEnum,this->enum_type,parameters);
 
 }
Index: /issm/trunk/src/c/objects/ElementResults/ElementResult.h
===================================================================
--- /issm/trunk/src/c/objects/ElementResults/ElementResult.h	(revision 5528)
+++ /issm/trunk/src/c/objects/ElementResults/ElementResult.h	(revision 5529)
@@ -25,4 +25,3 @@
 };
 
-void NodalValuesUnitConversion(double* nodal_values, int num_nodal_values,int enum_type,Parameters* parameters);
 #endif
Index: /issm/trunk/src/c/objects/ElementResults/ElementResultLocal.h
===================================================================
--- /issm/trunk/src/c/objects/ElementResults/ElementResultLocal.h	(revision 5528)
+++ /issm/trunk/src/c/objects/ElementResults/ElementResultLocal.h	(revision 5529)
@@ -8,6 +8,4 @@
 class Parameters;
 
-void NodalValuesUnitConversion(double* patch, int patch_size,int enum_type,Parameters* parameters);
-
 #endif //ifndef _ELEMENTRESULTLOCAL_H_
 
Index: /issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.cpp	(revision 5528)
+++ /issm/trunk/src/c/objects/ElementResults/PentaVertexElementResult.cpp	(revision 5529)
@@ -173,5 +173,5 @@
 void PentaVertexElementResult::ProcessUnits(Parameters* parameters){
 	
-	NodalValuesUnitConversion(this->values,6,this->enum_type,parameters);
+	UnitConversion(this->values,6,IuToExtEnum,this->enum_type,parameters);
 
 }
Index: /issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.cpp
===================================================================
--- /issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.cpp	(revision 5528)
+++ /issm/trunk/src/c/objects/ElementResults/TriaVertexElementResult.cpp	(revision 5529)
@@ -162,5 +162,5 @@
 void TriaVertexElementResult::ProcessUnits(Parameters* parameters){
 	
-	NodalValuesUnitConversion(this->values,3,this->enum_type,parameters);
+	UnitConversion(this->values,3,IuToExtEnum,this->enum_type,parameters);
 
 }
Index: /issm/trunk/src/c/objects/Elements/Penta.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 5528)
+++ /issm/trunk/src/c/objects/Elements/Penta.cpp	(revision 5529)
@@ -1308,5 +1308,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vx_values[0],numgrids,VxEnum,this->parameters);
+	if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
 
 	/*now, compute maximum:*/
@@ -1337,5 +1337,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vy_values[0],numgrids,VyEnum,this->parameters);
+	if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
 
 	/*now, compute maximum:*/
@@ -1366,5 +1366,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vz_values[0],numgrids,VzEnum,this->parameters);
+	if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
 
 	/*now, compute maximum:*/
@@ -1395,5 +1395,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vel_values[0],numgrids,VelEnum,this->parameters);
+	if(process_units)UnitConversion(&vel_values[0],numgrids,IuToExtEnum,VelEnum,this->parameters);
 
 	/*now, compute maximum:*/
@@ -1425,5 +1425,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vx_values[0],numgrids,VxEnum,this->parameters);
+	if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
 
 	/*now, compute maximum:*/
@@ -1455,5 +1455,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vy_values[0],numgrids,VyEnum,this->parameters);
+	if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
 
 	/*now, compute maximum:*/
@@ -1485,5 +1485,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vz_values[0],numgrids,VzEnum,this->parameters);
+	if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
 
 	/*now, compute maximum:*/
@@ -1515,5 +1515,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vel_values[0],numgrids,VelEnum,this->parameters);
+	if(process_units)UnitConversion(&vel_values[0],numgrids,IuToExtEnum,VelEnum,this->parameters);
 
 	/*now, compute minimum:*/
@@ -1545,5 +1545,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vx_values[0],numgrids,VxEnum,this->parameters);
+	if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
 
 	/*now, compute minimum:*/
@@ -1575,5 +1575,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vy_values[0],numgrids,VyEnum,this->parameters);
+	if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
 
 	/*now, compute minimum:*/
@@ -1605,5 +1605,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vz_values[0],numgrids,VzEnum,this->parameters);
+	if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
 
 	/*now, compute minimum:*/
Index: /issm/trunk/src/c/objects/Elements/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 5528)
+++ /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 5529)
@@ -1652,5 +1652,5 @@
 
 	/*Process units: */
-	NodalValuesUnitConversion(&mass_flux,1,MassFluxEnum,this->parameters);
+	mass_flux=UnitConversion(mass_flux,IuToExtEnum,MassFluxEnum,this->parameters);
 
 	return mass_flux;
@@ -1674,5 +1674,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vx_values[0],numgrids,VxEnum,this->parameters);
+	if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
 
 	/*now, compute maximum:*/
@@ -1703,5 +1703,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vy_values[0],numgrids,VyEnum,this->parameters);
+	if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
 
 	/*now, compute maximum:*/
@@ -1732,5 +1732,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vz_values[0],numgrids,VzEnum,this->parameters);
+	if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
 
 	/*now, compute maximum:*/
@@ -1761,5 +1761,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vel_values[0],numgrids,VelEnum,this->parameters);
+	if(process_units)UnitConversion(&vel_values[0],numgrids,IuToExtEnum,VelEnum,this->parameters);
 
 	/*now, compute maximum:*/
@@ -1791,5 +1791,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vx_values[0],numgrids,VxEnum,this->parameters);
+	if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
 
 	/*now, compute maximum:*/
@@ -1821,5 +1821,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vy_values[0],numgrids,VyEnum,this->parameters);
+	if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
 
 	/*now, compute maximum:*/
@@ -1851,5 +1851,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vz_values[0],numgrids,VzEnum,this->parameters);
+	if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
 
 	/*now, compute maximum:*/
@@ -1881,5 +1881,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vel_values[0],numgrids,VelEnum,this->parameters);
+	if(process_units)UnitConversion(&vel_values[0],numgrids,IuToExtEnum,VelEnum,this->parameters);
 
 	/*now, compute minimum:*/
@@ -1911,5 +1911,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vx_values[0],numgrids,VxEnum,this->parameters);
+	if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
 
 	/*now, compute minimum:*/
@@ -1941,5 +1941,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vy_values[0],numgrids,VyEnum,this->parameters);
+	if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
 
 	/*now, compute minimum:*/
@@ -1971,5 +1971,5 @@
 
 	/*process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&vz_values[0],numgrids,VzEnum,this->parameters);
+	if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
 
 	/*now, compute minimum:*/
@@ -2152,5 +2152,5 @@
 	}
 	/*Process units: */
-	if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,SurfaceAbsVelMisfitEnum,this->parameters);
+	if(process_units)UnitConversion(&misfit_list[0],numgrids,IuToExtEnum,SurfaceAbsVelMisfitEnum,this->parameters);
 
 	/*Apply weights to misfits*/
@@ -2284,5 +2284,5 @@
 
 	/*Process units: */
-	if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,SurfaceRelVelMisfitEnum,this->parameters);
+	if(process_units)UnitConversion(&misfit_list[0],numgrids,IuToExtEnum,SurfaceRelVelMisfitEnum,this->parameters);
 
 	/*Apply weights to misfits*/
@@ -2414,5 +2414,5 @@
 
 	/*Process units: */
-	if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,SurfaceLogVelMisfitEnum,this->parameters);
+	if(process_units)UnitConversion(&misfit_list[0],numgrids,IuToExtEnum,SurfaceLogVelMisfitEnum,this->parameters);
 
 	/*Apply weights to misfits*/
@@ -2546,5 +2546,5 @@
 
 	/*Process units: */
-	if(process_units)NodalValuesUnitConversion(&misfit_list[0],numgrids,SurfaceLogVxVyMisfitEnum,this->parameters);
+	if(process_units)UnitConversion(&misfit_list[0],numgrids,IuToExtEnum,SurfaceLogVxVyMisfitEnum,this->parameters);
 
 	/*Apply weights to misfits*/
@@ -2674,5 +2674,5 @@
 
 	/*Process units: */
-	if(process_units)NodalValuesUnitConversion(&misfit_square_list[0],numgrids,SurfaceAverageVelMisfitEnum,this->parameters);
+	if(process_units)UnitConversion(&misfit_square_list[0],numgrids,IuToExtEnum,SurfaceAverageVelMisfitEnum,this->parameters);
 
 	/*Take the square root, and scale by surface: */
Index: /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp	(revision 5528)
+++ /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp	(revision 5529)
@@ -418,5 +418,5 @@
 
 	/*Process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&valuescopy[0],numnodes,enum_type,parameters);
+	if(process_units)UnitConversion(&valuescopy[0],numnodes,IuToExtEnum,enum_type,parameters);
 
 	/*Now, figure out minimum of valuescopy: */
Index: /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp	(revision 5528)
+++ /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp	(revision 5529)
@@ -270,5 +270,5 @@
 
 	/*Process units if requested: */
-	if(process_units)NodalValuesUnitConversion(&valuescopy[0],numnodes,enum_type,parameters);
+	if(process_units)UnitConversion(&valuescopy[0],numnodes,IuToExtEnum,enum_type,parameters);
 
 	/*Now, figure out minimum of valuescopy: */
Index: sm/trunk/src/c/shared/Numerics/NodalValuesUnitConversion.cpp
===================================================================
--- /issm/trunk/src/c/shared/Numerics/NodalValuesUnitConversion.cpp	(revision 5528)
+++ 	(revision )
@@ -1,42 +1,0 @@
-/*!\file:  NodalValuesUnitConversion.cpp
- * \brief: process nodal_values held in a ElementResult object.
- * For example, velocities need to be in m/yr, melting rates in m/yr, etc ...
- * This centralizes all post-processing of results when they are being output.
- */ 
-
-#ifdef HAVE_CONFIG_H
-	#include "config.h"
-#else
-#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
-#endif
-
-#include "../../Container/Container.h"
-#include "../../objects/objects.h"
-#include "../../EnumDefinitions/EnumDefinitions.h"
-#include "../../shared/shared.h"
-
-void NodalValuesUnitConversion(double* nodal_values, int num_nodal_values,int enum_type,Parameters* parameters){
-
-	int i;
-	double yts;
-	double scale;
-
-	/*Get some values from parameters, that are often needed: */
-	parameters->FindParam(&yts,YtsEnum);
-
-	/*Get scaling factor: */
-	switch(enum_type){
-		case VxEnum:   scale=yts;break; //m/yr
-		case VyEnum:   scale=yts;break; //m/yr
-		case VzEnum:   scale=yts;break; //m/yr
-		case VelEnum:  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
-		case MassFluxEnum:    scale=pow(10,-12)*yts;break; // (GigaTon/year)
-		default: return;
-	}
-		
-	/*Scale : */
-	for(i=0;i<num_nodal_values;i++)nodal_values[i]=nodal_values[i]*scale; 
-}
Index: /issm/trunk/src/c/shared/Numerics/UnitConversion.cpp
===================================================================
--- /issm/trunk/src/c/shared/Numerics/UnitConversion.cpp	(revision 5529)
+++ /issm/trunk/src/c/shared/Numerics/UnitConversion.cpp	(revision 5529)
@@ -0,0 +1,79 @@
+/*!\file:  UnitConversion.cpp
+ * \brief: convert units from the model to IU or from IU to the model.
+ */ 
+
+/*headers {{{1*/
+#ifdef HAVE_CONFIG_H
+	#include "config.h"
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "../../Container/Container.h"
+#include "../../objects/objects.h"
+#include "../../EnumDefinitions/EnumDefinitions.h"
+#include "../../shared/shared.h"
+
+double UnitConversionScaleFactor(int type_enum,Parameters* parameters);
+/*}}}*/
+
+void UnitConversion(double* values, int numvalues,int direction_enum, int type_enum, Parameters* parameters){
+
+	double scale;
+	int i;
+
+	/*Get scaling factor: */
+	scale=UnitConversionScaleFactor(type_enum,parameters);
+
+	/*Now, which direction are we going? once determined, use scale factor: */
+	if(direction_enum==IuToExtEnum) for(i=0;i<numvalues;i++)values[i]=values[i]*scale; 
+	else if(direction_enum==ExtToIuEnum) for(i=0;i<numvalues;i++)values[i]=values[i]/scale; 
+	else ISSMERROR(" wrong direction for unit conversion, either IuToExtEnum or ExtToIuEnum. ");
+
+}
+
+double UnitConversion(double value, int direction_enum, int type_enum, Parameters* parameters){
+
+	double scale;
+
+	/*Get scaling factor: */
+	scale=UnitConversionScaleFactor(type_enum,parameters);
+
+	/*Now, which direction are we going? once determined, use scale factor: */
+	if(direction_enum==IuToExtEnum)value=value*scale;
+	else if(direction_enum==ExtToIuEnum)value=value/scale;
+	else ISSMERROR(" wrong direction for unit conversion, either IuToExtEnum or ExtToIuEnum. ");
+
+	return value;
+}
+
+
+
+double UnitConversionScaleFactor(int type_enum,Parameters* parameters){
+
+	double yts;
+	
+	/*Get some values from parameters, that are often needed: */
+	parameters->FindParam(&yts,YtsEnum);
+
+	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 MeltingRateEnum: scale=yts;break; //m/yr
+		case MisfitEnum:      scale=pow(yts,2);break; //(m/yr)^2
+		case MassFluxEnum:    scale=pow(10,-12)*yts;break; // (GigaTon/year)
+		default: scale=1.0; break;
+	}
+	return scale;
+}
+
+
+
Index: /issm/trunk/src/c/shared/Numerics/numerics.h
===================================================================
--- /issm/trunk/src/c/shared/Numerics/numerics.h	(revision 5528)
+++ /issm/trunk/src/c/shared/Numerics/numerics.h	(revision 5529)
@@ -9,4 +9,5 @@
 #include "./isnan.h"
 class Input;
+class Parameters;
 
 struct OptArgs;
@@ -20,4 +21,6 @@
 double norm(double* vector);
 void IsInputConverged(double* peps, Input** new_inputs,Input** old_inputs,int num_inputs,int criterion_enum);
+void UnitConversion(double* values, int numvalues,int direction_enum, int type_enum, Parameters* parameters);
+double UnitConversion(double value, int direction_enum, int type_enum, Parameters* parameters);
 
 #endif //ifndef _NUMERICS_H_
