Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 27919)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 27920)
@@ -86,4 +86,5 @@
 	./classes/Cfdragcoeffabsgradtransient.cpp \
 	./classes/Cfrheologybbarabsgrad.cpp \
+	./classes/Cfrheologybbarabsgradtransient.cpp \
 	./classes/Cfsurfacelogvel.cpp \
 	./classes/Cflevelsetmisfit.cpp \
Index: /issm/trunk-jpl/src/c/classes/Cfrheologybbarabsgrad.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Cfrheologybbarabsgrad.cpp	(revision 27919)
+++ /issm/trunk-jpl/src/c/classes/Cfrheologybbarabsgrad.cpp	(revision 27920)
@@ -29,10 +29,9 @@
 	this->definitionenum = -1;
 	this->name = NULL;
-	this->weights_enum = UNDEF;
-	this->timepassedflag = false;
 	this->J = 0.;
+	this->firsttimepassed = false;
 }
 /*}}}*/
-Cfrheologybbarabsgrad::Cfrheologybbarabsgrad(char* in_name, int in_definitionenum, int in_weights_enum){/*{{{*/
+Cfrheologybbarabsgrad::Cfrheologybbarabsgrad(char* in_name, int in_definitionenum){/*{{{*/
 
 	this->definitionenum=in_definitionenum;
@@ -41,11 +40,9 @@
 	xMemCpy<char>(this->name,in_name,strlen(in_name)+1);
 
-	this->weights_enum=in_weights_enum;
-	this->timepassedflag=false;
-
 	this->J=0;
+	this->firsttimepassed = false;
 }
 /*}}}*/
-Cfrheologybbarabsgrad::Cfrheologybbarabsgrad(char* in_name, int in_definitionenum, int in_weights_enum, bool in_timepassedflag, IssmDouble in_J){/*{{{*/
+Cfrheologybbarabsgrad::Cfrheologybbarabsgrad(char* in_name, int in_definitionenum, IssmDouble in_J){/*{{{*/
 
 	this->definitionenum=in_definitionenum;
@@ -54,8 +51,17 @@
 	xMemCpy<char>(this->name,in_name,strlen(in_name)+1);
 
-	this->weights_enum=in_weights_enum;
-	this->timepassedflag=in_timepassedflag;
+	this->J=in_J;
+	this->firsttimepassed = false;
+}
+/*}}}*/
+Cfrheologybbarabsgrad::Cfrheologybbarabsgrad(char* in_name, int in_definitionenum, IssmDouble in_J, bool in_firsttimepassed){/*{{{*/
+
+	this->definitionenum=in_definitionenum;
+
+	this->name		= xNew<char>(strlen(in_name)+1);
+	xMemCpy<char>(this->name,in_name,strlen(in_name)+1);
 
 	this->J=in_J;
+	this->firsttimepassed = in_firsttimepassed;
 }
 /*}}}*/
@@ -66,5 +72,5 @@
 /*Object virtual function resolutoin: */
 Object* Cfrheologybbarabsgrad::copy() {/*{{{*/
-	Cfrheologybbarabsgrad* mf = new Cfrheologybbarabsgrad(this->name,this->definitionenum, this->weights_enum,this->timepassedflag,this->J);
+	Cfrheologybbarabsgrad* mf = new Cfrheologybbarabsgrad(this->name,this->definitionenum, this->J, this->firsttimepassed);
 	return (Object*) mf;
 }
@@ -76,6 +82,4 @@
 void Cfrheologybbarabsgrad::Echo(void){/*{{{*/
 	_printf_(" Cfrheologybbarabsgrad: " << name << " " << this->definitionenum << "\n");
-	_printf_("    weights_enum: " << weights_enum << " " << EnumToStringx(weights_enum) << "\n");
-	_printf_("	  timepassedflag: "<<timepassedflag<<"\n");
 }
 /*}}}*/
@@ -92,7 +96,6 @@
 	marshallhandle->call(this->definitionenum);
 	marshallhandle->call(this->name);
-	marshallhandle->call(this->weights_enum);
-	marshallhandle->call(this->timepassedflag);
 	marshallhandle->call(this->J);
+	marshallhandle->call(this->firsttimepassed);
 } 
 /*}}}*/
@@ -119,17 +122,19 @@
 	IssmDouble J_sum=0.;
 
-	for(Object* & object : femmodel->elements->objects){
-		Element* element=xDynamicCast<Element*>(object);
-		J_part+=this->Cfrheologybbarabsgrad_Calculation(element,weights_enum);
+	if (!this->firsttimepassed){
+		for(Object* & object : femmodel->elements->objects){
+			Element* element=xDynamicCast<Element*>(object);
+			J_part+=this->Cfrheologybbarabsgrad_Calculation(element);
+		}
+
+		ISSM_MPI_Allreduce( (void*)&J_part,(void*)&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
+		ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+		this->J = J_sum;
+
+		this->firsttimepassed = true;
 	}
-
-	ISSM_MPI_Allreduce( (void*)&J_part,(void*)&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
-	ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
-
-	this->timepassedflag = true;
-	this->J = J_sum;
 	return this->J;
 }/*}}}*/
-IssmDouble Cfrheologybbarabsgrad::Cfrheologybbarabsgrad_Calculation(Element* element, int weights_enum){/*{{{*/
+IssmDouble Cfrheologybbarabsgrad::Cfrheologybbarabsgrad_Calculation(Element* element){/*{{{*/
 
 	int        domaintype,numcomponents;
Index: /issm/trunk-jpl/src/c/classes/Cfrheologybbarabsgrad.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Cfrheologybbarabsgrad.h	(revision 27919)
+++ /issm/trunk-jpl/src/c/classes/Cfrheologybbarabsgrad.h	(revision 27920)
@@ -19,12 +19,12 @@
 		int         definitionenum;
 		char*       name;
-		int         weights_enum;
-		bool			timepassedflag;
+		bool			firsttimepassed;
 		IssmDouble  J;
 
 		/*Cfrheologybbarabsgrad constructors, destructors :*/
 		Cfrheologybbarabsgrad();
-		Cfrheologybbarabsgrad(char* in_name, int in_definitionenum, int in_weights_enum);
-		Cfrheologybbarabsgrad(char* in_name, int in_definitionenum, int in_weights_enum,  bool in_timepassedflag, IssmDouble in_J);
+		Cfrheologybbarabsgrad(char* in_name, int in_definitionenum);
+		Cfrheologybbarabsgrad(char* in_name, int in_definitionenum, IssmDouble in_J);
+		Cfrheologybbarabsgrad(char* in_name, int in_definitionenum, IssmDouble in_J, bool in_firsttimepassed);
 		~Cfrheologybbarabsgrad();
 
@@ -41,5 +41,5 @@
 		char* Name();
 		IssmDouble Response(FemModel* femmodel);
-		IssmDouble Cfrheologybbarabsgrad_Calculation(Element* element, int weights_enum);
+		IssmDouble Cfrheologybbarabsgrad_Calculation(Element* element);
 };
 #endif  /* _CFRHEOLOGYBBARABSGRAD_H_ */
Index: /issm/trunk-jpl/src/c/classes/Cfrheologybbarabsgradtransient.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Cfrheologybbarabsgradtransient.cpp	(revision 27920)
+++ /issm/trunk-jpl/src/c/classes/Cfrheologybbarabsgradtransient.cpp	(revision 27920)
@@ -0,0 +1,227 @@
+/*!\file Cfrheologybbarabsgradtransient.cpp
+ * \brief: Cfrheologybbarabsgradtransient Object
+ */
+
+/*Headers:*/
+/*{{{*/
+#ifdef HAVE_CONFIG_H
+   #include <config.h>
+#else
+#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
+#endif
+
+#include "./classes.h"
+#include "./ExternalResults/ExternalResult.h"
+#include "./ExternalResults/Results.h"
+#include "../datastructures/datastructures.h"
+#include "./Elements/Element.h"
+#include "./Elements/Elements.h"
+#include "./FemModel.h"
+#include "../modules/SurfaceAreax/SurfaceAreax.h"
+#include "../classes/Params/Parameters.h"
+#include "../classes/gauss/Gauss.h"
+#include "./Inputs/DatasetInput.h"
+/*}}}*/
+
+/*Cfrheologybbarabsgradtransient constructors, destructors :*/
+Cfrheologybbarabsgradtransient::Cfrheologybbarabsgradtransient(){/*{{{*/
+
+	this->definitionenum = -1;
+	this->name = NULL;
+	this->datatimes         = NULL;
+	this->passedflags   = NULL;
+	this->J = 0.;
+}
+/*}}}*/
+Cfrheologybbarabsgradtransient::Cfrheologybbarabsgradtransient(char* in_name, int in_definitionenum, int in_num_datatimes, IssmDouble* in_datatimes, bool* in_passedflags, IssmDouble in_J){/*{{{*/
+
+	this->definitionenum=in_definitionenum;
+
+	this->name		= xNew<char>(strlen(in_name)+1);
+	xMemCpy<char>(this->name,in_name,strlen(in_name)+1);
+
+	this->num_datatimes = in_num_datatimes;
+
+	/*Allocate arrays*/
+	_assert_(this->num_datatimes>0);
+	this->datatimes   = xNew<IssmDouble>(this->num_datatimes);
+	this->passedflags = xNew<bool>(this->num_datatimes);
+	xMemCpy<IssmDouble>(this->datatimes,in_datatimes,this->num_datatimes);
+	xMemCpy<bool>(this->passedflags,in_passedflags,this->num_datatimes);
+
+	this->J = in_J;
+}
+/*}}}*/
+Cfrheologybbarabsgradtransient::Cfrheologybbarabsgradtransient(char* in_name, int in_definitionenum, int in_num_datatimes, IssmDouble* in_datatimes){/*{{{*/
+
+	this->definitionenum=in_definitionenum;
+
+	this->name		= xNew<char>(strlen(in_name)+1);
+	xMemCpy<char>(this->name,in_name,strlen(in_name)+1);
+
+	this->num_datatimes = in_num_datatimes;
+
+	/*Allocate arrays*/
+	_assert_(this->num_datatimes>0);
+	this->datatimes   = xNew<IssmDouble>(this->num_datatimes);
+	this->passedflags = xNew<bool>(this->num_datatimes);
+	xMemCpy<IssmDouble>(this->datatimes,in_datatimes,this->num_datatimes);
+
+	/*initialize passedtimes to false*/
+	for(int i=0;i<this->num_datatimes;i++) this->passedflags[i]= false;
+	this->J = 0;
+}
+/*}}}*/
+Cfrheologybbarabsgradtransient::~Cfrheologybbarabsgradtransient(){/*{{{*/
+	if(this->name)xDelete(this->name);
+}
+/*}}}*/
+/*Object virtual function resolutoin: */
+Object* Cfrheologybbarabsgradtransient::copy() {/*{{{*/
+	Cfrheologybbarabsgradtransient* mf = new Cfrheologybbarabsgradtransient(this->name,this->definitionenum, this->num_datatimes, this->datatimes, this->passedflags, this->J);
+	return (Object*) mf;
+}
+/*}}}*/
+void Cfrheologybbarabsgradtransient::DeepEcho(void){/*{{{*/
+	this->Echo();
+}
+/*}}}*/
+void Cfrheologybbarabsgradtransient::Echo(void){/*{{{*/
+	_printf_(" Cfrheologybbarabsgradtransient: " << name << " " << this->definitionenum << "\n");
+	_error_("not implemented yet");
+}
+/*}}}*/
+int Cfrheologybbarabsgradtransient::Id(void){/*{{{*/
+	return -1;
+}
+/*}}}*/
+void Cfrheologybbarabsgradtransient::Marshall(MarshallHandle* marshallhandle){/*{{{*/
+	
+	/*ok, marshall operations: */
+	int object_enum=CfrheologybbarabsgradtransientEnum;
+	marshallhandle->call(object_enum);
+
+	marshallhandle->call(this->definitionenum);
+	marshallhandle->call(this->name);
+	marshallhandle->call(this->num_datatimes);
+   marshallhandle->call(this->datatimes,this->num_datatimes);
+   marshallhandle->call(this->passedflags,this->num_datatimes);
+   marshallhandle->call(this->J);
+} 
+/*}}}*/
+int Cfrheologybbarabsgradtransient::ObjectEnum(void){/*{{{*/
+	return CfrheologybbarabsgradtransientEnum;
+}
+/*}}}*/
+/*Definition virtual function resolutoin: */
+int Cfrheologybbarabsgradtransient::DefinitionEnum(){/*{{{*/
+	return this->definitionenum;
+}
+/*}}}*/
+char* Cfrheologybbarabsgradtransient::Name(){/*{{{*/
+	char* name2=xNew<char>(strlen(this->name)+1);
+	xMemCpy(name2,this->name,strlen(this->name)+1);
+
+	return name2;
+}
+/*}}}*/
+IssmDouble Cfrheologybbarabsgradtransient::Response(FemModel* femmodel){/*{{{*/
+
+	/*recover time parameters: */
+	IssmDouble time;
+	femmodel->parameters->FindParam(&time,TimeEnum);
+	
+	/*Find closest datatime that is less than time*/
+	int pos=-1;
+	for(int i=0;i<this->num_datatimes;i++){
+		if(this->datatimes[i]<=time){
+			pos = i;
+		}
+		else{
+			break;
+		}
+	}
+
+	/*if pos=-1, time is earlier than the first data observation in this dataset*/
+	if(pos==-1){
+		_assert_(this->J==0.);
+		return 0.;
+	}
+	
+	/*Check that we have not yet calculated this cost function*/
+	if(this->passedflags[pos]){
+		return this->J;
+	}
+	
+	/*Calculate cost function for this time slice*/
+	IssmDouble J_part=0.;
+	IssmDouble J_sum=0.;
+
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
+		J_part+=this->Cfrheologybbarabsgradtransient_Calculation(element);
+	}
+
+	ISSM_MPI_Allreduce( (void*)&J_part,(void*)&J_sum,1,ISSM_MPI_DOUBLE,ISSM_MPI_SUM,IssmComm::GetComm());
+	ISSM_MPI_Bcast(&J_sum,1,ISSM_MPI_DOUBLE,0,IssmComm::GetComm());
+
+	this->passedflags[pos]= true;
+	this->J += J_sum;
+
+	return this->J;
+}/*}}}*/
+IssmDouble Cfrheologybbarabsgradtransient::Cfrheologybbarabsgradtransient_Calculation(Element* element){/*{{{*/
+
+	int        domaintype,numcomponents;
+	IssmDouble Jelem=0.;
+	IssmDouble Jdet;
+	IssmDouble dp[2],weight;
+	IssmDouble* xyz_list = NULL;
+
+	/*Get basal element*/
+	if(!element->IsOnBase()) return 0.;
+
+	/*If on water, return 0: */
+	if(!element->IsIceInElement()) return 0.;
+
+	/*Get problem dimension*/
+	element->FindParam(&domaintype,DomainTypeEnum);
+	switch(domaintype){
+		case Domain2DverticalEnum:   numcomponents   = 1; break;
+		case Domain3DEnum:           numcomponents   = 2; break;
+		case Domain2DhorizontalEnum: numcomponents   = 2; break;
+		default: _error_("not supported yet");
+	}
+
+	/*Spawn surface element*/
+	Element* basalelement = element->SpawnBasalElement();
+
+	/* Get node coordinates*/
+	basalelement->GetVerticesCoordinates(&xyz_list);
+
+	/*Get input if it already exists*/
+	DatasetInput *datasetinput = basalelement->GetDatasetInput(definitionenum);  _assert_(datasetinput);
+	Input* rheologyb_input=basalelement->GetInput(MaterialsRheologyBbarEnum);                  _assert_(rheologyb_input);
+
+	/* Start  looping on the number of gaussian points: */
+	Gauss* gauss=basalelement->NewGauss(2);
+	while(gauss->next()){
+
+		/* Get Jacobian determinant: */
+		basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss);
+
+		/*Get all parameters at gaussian point*/
+		datasetinput->GetInputValue(&weight,gauss,WeightsSurfaceObservationEnum);
+		rheologyb_input->GetInputDerivativeValue(&dp[0],xyz_list,gauss);
+
+		/*Add to cost function*/
+		Jelem+=weight*.5*dp[0]*dp[0]*Jdet*gauss->weight;
+		if(numcomponents==2) Jelem+=weight*.5*dp[1]*dp[1]*Jdet*gauss->weight;
+	}
+
+	/*clean up and Return: */
+	if(basalelement->IsSpawnedElement()){basalelement->DeleteMaterials(); delete basalelement;};
+	xDelete<IssmDouble>(xyz_list);
+	delete gauss;
+	return Jelem;
+}/*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Cfrheologybbarabsgradtransient.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Cfrheologybbarabsgradtransient.h	(revision 27920)
+++ /issm/trunk-jpl/src/c/classes/Cfrheologybbarabsgradtransient.h	(revision 27920)
@@ -0,0 +1,45 @@
+/*!\file Cfrheologybbarabsgradtransient.h
+ * \brief: header file for Cfrheologybbarabsgradtransient object
+ */
+
+#ifndef _CFRHEOLOGYBBARABSGRADTRANSIENT_H_
+#define _CFRHEOLOGYBBARABSGRADTRANSIENT_H_
+
+/*Headers:*/
+#include "./Definition.h"
+class FemModel;
+
+IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,int output_enum);
+
+class Cfrheologybbarabsgradtransient: public Object, public Definition{
+
+	public: 
+
+		int         definitionenum;
+		char       *name;
+		int         num_datatimes;
+		IssmDouble *datatimes;
+		bool       *passedflags;
+		IssmDouble  J;
+
+		/*Cfrheologybbarabsgradtransient constructors, destructors :*/
+		Cfrheologybbarabsgradtransient();
+		Cfrheologybbarabsgradtransient(char* in_name, int in_definitionenum, int num_datatimes, IssmDouble* in_datatime);
+		Cfrheologybbarabsgradtransient(char* in_name, int in_definitionenum, int num_datatimes, IssmDouble* in_datatime, bool* in_timepassedflag, IssmDouble in_J);
+		~Cfrheologybbarabsgradtransient();
+
+		/*Object virtual function resolutoin: */
+		Object* copy();
+		void DeepEcho(void);
+		void Echo(void);
+		int Id(void);
+		void Marshall(MarshallHandle* marshallhandle);
+		int ObjectEnum(void);
+
+		/*Definition virtual function resolutoin: */
+		int DefinitionEnum();
+		char* Name();
+		IssmDouble Response(FemModel* femmodel);
+		IssmDouble Cfrheologybbarabsgradtransient_Calculation(Element* element);
+};
+#endif  /* _CFRHEOLOGYBBARABSGRADTRANSIENT_H_ */
Index: /issm/trunk-jpl/src/c/classes/classes.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/classes.h	(revision 27919)
+++ /issm/trunk-jpl/src/c/classes/classes.h	(revision 27920)
@@ -28,4 +28,5 @@
 #include "./Cfdragcoeffabsgradtransient.h"
 #include "./Cfrheologybbarabsgrad.h"
+#include "./Cfrheologybbarabsgradtransient.h"
 #include "./Cfsurfacelogvel.h"
 #include "./Cflevelsetmisfit.h"
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 27919)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 27920)
@@ -384,5 +384,5 @@
 				int*         cfdraggradt_weights_N_s				= NULL;
 
-				/*Fetch name, model_string, observation, observation_string, etc ... (see src/m/classes/cfdragcoeffabsgrad.m): */
+				/*Fetch name, model_string, observation, observation_string, etc ... (see src/m/classes/cfdragcoeffabsgradtransient.m): */
 				iomodel->FetchMultipleData(&cfdraggradt_name_s,&num_cfdragcoeffabsgradtransients,                                                        "md.cfdragcoeffabsgradtransient.name");
 				iomodel->FetchMultipleData(&cfdraggradt_definitionstring_s,&num_cfdragcoeffabsgradtransients,                                            "md.cfdragcoeffabsgradtransient.definitionstring");
@@ -486,4 +486,58 @@
             xDelete<int>(cfrheologybbarabsgrad_weights_N_s);
             xDelete<char*>(cfrheologybbarabsgrad_weights_string_s);
+            /*}}}*/
+         }
+			else if (output_definition_enums[i]==CfrheologybbarabsgradtransientEnum){
+				/*Deal with cfrheologybbarabsgradtransient: {{{*/
+
+				/*cfrheologybbarabsgrad variables: */
+				int          num_cfrheologybbarabsgradtransients, test;
+				char**       cfrheogradt_name_s                = NULL;
+				char**       cfrheogradt_definitionstring_s    = NULL;
+				IssmDouble** cfrheogradt_weights_s             = NULL;
+				int*         cfrheogradt_weights_M_s           = NULL;
+				int*         cfrheogradt_weights_N_s           = NULL;
+				char**       cfrheogradt_weights_string_s      = NULL;
+
+				/*Fetch name, model_string, observation, observation_string, etc ... (see src/m/classes/cfrheologybbarabsgradtransient.m): */
+				iomodel->FetchMultipleData(&cfrheogradt_name_s,&num_cfrheologybbarabsgradtransients,                                                        "md.cfrheologybbarabsgradtransient.name");
+				iomodel->FetchMultipleData(&cfrheogradt_definitionstring_s,&num_cfrheologybbarabsgradtransients,                                            "md.cfrheologybbarabsgradtransient.definitionstring");
+				iomodel->FetchMultipleData(&cfrheogradt_weights_s,&cfrheogradt_weights_M_s,&cfrheogradt_weights_N_s,&test,             "md.cfrheologybbarabsgradtransient.weights");
+
+				for(j=0;j<num_cfrheologybbarabsgradtransients;j++){
+
+					if (cfrheogradt_weights_M_s[j]!=iomodel->numberofvertices+1) _error_("weights should be a P1 time series");
+					
+					/*extract data times from last row of observations*/
+					IssmDouble *datatimes = xNew<IssmDouble>(cfrheogradt_weights_N_s[j]);
+					for(int k=0;k<cfrheogradt_weights_N_s[j];k++) datatimes[k] = (cfrheogradt_weights_s[j])[cfrheogradt_weights_N_s[j]*(cfrheogradt_weights_M_s[j]-1)+k];
+
+					/*First create a cfrheologybbarabsgradtransient object for that specific string:*/
+					output_definitions->AddObject(new Cfrheologybbarabsgradtransient(cfrheogradt_name_s[j],StringToEnumx(cfrheogradt_definitionstring_s[j]), cfrheogradt_weights_N_s[j], datatimes));
+
+					/*Now, for this particular cfrheologybbarabsgrad object, make sure we plug into the elements: the observation, and the weights.*/
+					for(Object* & object : elements->objects){
+
+						Element* element=xDynamicCast<Element*>(object);
+
+						element->DatasetInputAdd(StringToEnumx(cfrheogradt_definitionstring_s[j]),cfrheogradt_weights_s[j],inputs,iomodel,cfrheogradt_weights_M_s[j],cfrheogradt_weights_N_s[j],1,WeightsSurfaceObservationEnum,WeightsSurfaceObservationEnum);
+
+					}
+				}
+				
+				/*Free resources:*/
+            for(j=0;j<num_cfrheologybbarabsgradtransients;j++){
+               char* string=NULL;
+               IssmDouble* matrix = NULL;
+
+               string = cfrheogradt_definitionstring_s[j];    xDelete<char>(string);
+               string = cfrheogradt_name_s[j];    xDelete<char>(string);
+               matrix = cfrheogradt_weights_s[j]; xDelete<IssmDouble>(matrix);
+            }
+            xDelete<char*>(cfrheogradt_name_s);
+            xDelete<char*>(cfrheogradt_definitionstring_s);
+            xDelete<IssmDouble*>(cfrheogradt_weights_s);
+            xDelete<int>(cfrheogradt_weights_M_s);
+            xDelete<int>(cfrheogradt_weights_N_s);
             /*}}}*/
          }
Index: /issm/trunk-jpl/src/c/shared/Enum/Enum.vim
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 27919)
+++ /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 27920)
@@ -1421,4 +1421,5 @@
 syn keyword cConstant CfdragcoeffabsgradtransientEnum
 syn keyword cConstant CfrheologybbarabsgradEnum
+syn keyword cConstant CfrheologybbarabsgradtransientEnum
 syn keyword cConstant CfsurfacelogvelEnum
 syn keyword cConstant CfsurfacesquareEnum
@@ -1800,4 +1801,5 @@
 syn keyword cType Cflevelsetmisfit
 syn keyword cType Cfrheologybbarabsgrad
+syn keyword cType Cfrheologybbarabsgradtransient
 syn keyword cType Cfsurfacelogvel
 syn keyword cType Cfsurfacesquare
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 27919)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 27920)
@@ -1420,4 +1420,5 @@
 	CfdragcoeffabsgradtransientEnum,
 	CfrheologybbarabsgradEnum,
+	CfrheologybbarabsgradtransientEnum,
 	CfsurfacelogvelEnum,
 	CfsurfacesquareEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 27919)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 27920)
@@ -1423,4 +1423,5 @@
 		case CfdragcoeffabsgradtransientEnum : return "Cfdragcoeffabsgradtransient";
 		case CfrheologybbarabsgradEnum : return "Cfrheologybbarabsgrad";
+		case CfrheologybbarabsgradtransientEnum : return "Cfrheologybbarabsgradtransient";
 		case CfsurfacelogvelEnum : return "Cfsurfacelogvel";
 		case CfsurfacesquareEnum : return "Cfsurfacesquare";
Index: /issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim	(revision 27919)
+++ /issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim	(revision 27920)
@@ -1414,4 +1414,5 @@
 syn keyword juliaConstC CfdragcoeffabsgradtransientEnum
 syn keyword juliaConstC CfrheologybbarabsgradEnum
+syn keyword juliaConstC CfrheologybbarabsgradtransientEnum
 syn keyword juliaConstC CfsurfacelogvelEnum
 syn keyword juliaConstC CfsurfacesquareEnum
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 27919)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 27920)
@@ -1456,4 +1456,5 @@
 	      else if (strcmp(name,"Cfdragcoeffabsgradtransient")==0) return CfdragcoeffabsgradtransientEnum;
 	      else if (strcmp(name,"Cfrheologybbarabsgrad")==0) return CfrheologybbarabsgradEnum;
+	      else if (strcmp(name,"Cfrheologybbarabsgradtransient")==0) return CfrheologybbarabsgradtransientEnum;
 	      else if (strcmp(name,"Cfsurfacelogvel")==0) return CfsurfacelogvelEnum;
 	      else if (strcmp(name,"Cfsurfacesquare")==0) return CfsurfacesquareEnum;
Index: /issm/trunk-jpl/src/m/classes/cfrheologybbarabsgradtransient.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/cfrheologybbarabsgradtransient.m	(revision 27920)
+++ /issm/trunk-jpl/src/m/classes/cfrheologybbarabsgradtransient.m	(revision 27920)
@@ -0,0 +1,68 @@
+%CFRHEOLOGYBBARABSGRADTRANSIENT class definition
+%
+%   Usage:
+%      cfrheologybbarabsgradtransient=cfdragcoeffabsgradtransient();
+%      cfrheologybbarabsgradtransient=cfdragcoeffabsgradtransient('name','SurfaceAltimetry',...
+%                    'definitionstring','Outputdefinition1',... 
+%                    'weights',ones(md.mesh.numberofvertices+1,1))%
+%
+
+classdef cfrheologybbarabsgradtransient
+	properties (SetAccess=public)
+		%cfrheologybbarabsgrad
+		name               = '';
+		definitionstring   = ''; %string that identifies this output definition uniquely, from 'Outputdefinition[1-100]'
+		weights            = NaN; %weight coefficients for every vertex
+	end
+	
+	methods
+		function self = extrude(self,md) % {{{
+			if ~isnan(self.weights)
+				self.weights=project3d(md,'vector',self.weights,'type','node');
+			end
+		end % }}}
+		function self = cfrheologybbarabsgradtransient(varargin) % {{{
+			if nargin==0,
+				self=setdefaultparameters(self);
+			else
+				%use provided options to change fields
+				options=pairoptions(varargin{:});
+
+				%get name
+				self.name=getfieldvalue(options,'name','');
+				self.definitionstring=getfieldvalue(options,'definitionstring');
+				self.weights=getfieldvalue(options,'weights',NaN);
+			end
+		end % }}}
+		function self = setdefaultparameters(self) % {{{
+		end % }}}
+		function md = checkconsistency(self,md,solution,analyses) % {{{
+
+			if ~ischar(self.name),
+				error('cfrheologybbarabsgradtransient error message: ''name'' field should be a string!');
+			end
+			OutputdefinitionStringArray={};
+			for i=1:200
+				OutputdefinitionStringArray{i}=strcat('Outputdefinition',num2str(i));
+			end
+			md = checkfield(md,'fieldname','self.definitionstring','field',self.definitionstring,'values',OutputdefinitionStringArray);
+			md = checkfield(md,'fieldname','self.weights','field',self.weights,'size',[md.mesh.numberofvertices+1 NaN],'NaN',1,'Inf',1);
+
+		end % }}}
+		function md = disp(self) % {{{
+		
+			disp(sprintf('   TimeMisfit:\n'));
+
+			fielddisplay(self,'name','identifier for this cfrheologybbarabsgrad response');
+			fielddisplay(self,'definitionstring','string that identifies this output definition uniquely, from ''Outputdefinition[1-10]''');
+			fielddisplay(self,'weights','weights (at vertices) to apply to the cfrheologybbarabsgrad');
+
+		end % }}}
+		function md = marshall(self,prefix,md,fid) % {{{
+
+		WriteData(fid,prefix,'data',self.name,'name','md.cfrheologybbarabsgradtransient.name','format','String');
+		WriteData(fid,prefix,'data',self.definitionstring,'name','md.cfrheologybbarabsgradtransient.definitionstring','format','String');
+		WriteData(fid,prefix,'data',self.weights,'name','md.cfrheologybbarabsgradtransient.weights','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
+		end % }}}
+	end
+end
