Index: /issm/trunk-jpl/src/c/classes/Inputs/Input.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/Input.h	(revision 27690)
+++ /issm/trunk-jpl/src/c/classes/Inputs/Input.h	(revision 27691)
@@ -48,4 +48,5 @@
 		virtual void   Pow(IssmDouble scale_factor){_error_("Not implemented yet");};
 		virtual void   Scale(IssmDouble scale_factor){_error_("Not implemented yet");};
+		virtual void   AverageAndReplace(void){_error_("Not implemented yet");};
 
 		virtual int  GetResultArraySize(void){_error_("Not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Inputs/Inputs.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/Inputs.cpp	(revision 27690)
+++ /issm/trunk-jpl/src/c/classes/Inputs/Inputs.cpp	(revision 27691)
@@ -302,5 +302,5 @@
 }
 /*}}}*/
-void     Inputs::Shift(int xenum, IssmDouble alpha){/*{{{*/
+void Inputs::Shift(int xenum, IssmDouble alpha){/*{{{*/
 
 	_assert_(this);
@@ -314,4 +314,15 @@
 	/*Shift: */
 	this->inputs[index_x]->Shift(alpha);
+}
+/*}}}*/
+void Inputs::AverageAndReplace(int inputenum){/*{{{*/
+
+	_assert_(this);
+
+	/*Get indices from enums*/
+	int index = EnumToIndex(inputenum);
+	if(!this->inputs[index]) _error_("Input "<<EnumToStringx(inputenum)<<" not found");
+
+	this->inputs[index]->AverageAndReplace();
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Inputs/Inputs.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/Inputs.h	(revision 27690)
+++ /issm/trunk-jpl/src/c/classes/Inputs/Inputs.h	(revision 27691)
@@ -50,4 +50,5 @@
 		void     AXPY(IssmDouble alpha, int xenum, int yenum);
 		void     Shift(int inputenum, IssmDouble alpha);
+		void     AverageAndReplace(int inputenum);
 		void     DeepEcho(void);
 		void     DeepEcho(int enum_in);
Index: /issm/trunk-jpl/src/c/classes/Inputs/TriaInput.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/TriaInput.cpp	(revision 27690)
+++ /issm/trunk-jpl/src/c/classes/Inputs/TriaInput.cpp	(revision 27691)
@@ -406,4 +406,24 @@
 }
 /*}}}*/
+void TriaInput::AverageAndReplace(void){/*{{{*/
+
+	/*Get local sum and local size*/
+	IssmDouble sum  = 0.;
+	for(int i=0;i<this->M*this->N;i++) sum += this->values[i];
+	sum = sum/(this->M*this->N);
+
+	/*Get sum across all procs*/
+	IssmDouble all_sum;
+	ISSM_MPI_Allreduce((void*)&sum,(void*)&all_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
+
+	/*Divide by number of procs*/
+	int        num_procs = IssmComm::GetSize();
+	IssmDouble newvalue = all_sum/num_procs;
+
+	/*Now replace existing input*/
+	this->Reset(P0Enum);
+	for(int i=0;i<this->M*this->N;i++) this->values[i] = newvalue;
+}
+/*}}}*/
 
 /*Object functions*/
Index: /issm/trunk-jpl/src/c/classes/Inputs/TriaInput.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Inputs/TriaInput.h	(revision 27690)
+++ /issm/trunk-jpl/src/c/classes/Inputs/TriaInput.h	(revision 27691)
@@ -41,4 +41,5 @@
 		void AXPY(Input* xinput,IssmDouble scalar);
 		void Shift(IssmDouble scalar);
+		void AverageAndReplace(void);
 		void PointWiseMult(Input* xinput);
 		void Serve(int numindices,int* indices);
