Index: /issm/trunk-jpl/src/c/cores/transient_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 25573)
+++ /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 25574)
@@ -392,8 +392,8 @@
 		femmodel->IceVolumeAboveFloatationx(&J,false);
 	}
-	if(IssmComm::GetRank()==0) tape_codi.registerOutput(J);
+	tape_codi.registerOutput(J);
 
 	tape_codi.setPassive();
-	J.gradient() = 1.0;
+	if(IssmComm::GetRank()==0) J.gradient() = 1.0;
 	tape_codi.evaluate();
 
@@ -465,9 +465,12 @@
 	}
 
+	/*Broadcast gradient to other ranks (make sure to sum all gradients)*/
+	double* gradient=xNew<double>(Xsize);
+	ISSM_MPI_Allreduce(Xb,gradient,Xsize,ISSM_MPI_PDOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
+
 	/*Now set final gradient*/
 	IssmDouble* aG=xNew<IssmDouble>(Xsize);
-	for(int i=0;i<Xsize;i++){
-		aG[i] = reCast<IssmDouble>(Xb[i]);
-	}
+	for(int i=0;i<Xsize;i++) aG[i] = reCast<IssmDouble>(gradient[i]);
+	xDelete<double>(gradient);
 	ControlInputSetGradientx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters,aG);
 	xDelete<IssmDouble>(aG);
