Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 27901)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 27902)
@@ -91,4 +91,5 @@
 	./classes/Cfsurfacesquaretransient.cpp \
 	./classes/Cfdragcoeffabsgrad.cpp \
+	./classes/Cfdragcoeffabsgradtransient.cpp \
 	./classes/Cfrheologybbarabsgrad.cpp \
 	./classes/Cfsurfacelogvel.cpp \
Index: /issm/trunk-jpl/src/c/classes/Cfdragcoeffabsgradtransient.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Cfdragcoeffabsgradtransient.cpp	(revision 27902)
+++ /issm/trunk-jpl/src/c/classes/Cfdragcoeffabsgradtransient.cpp	(revision 27902)
@@ -0,0 +1,243 @@
+/*!\file Cfdragcoeffabsgradtransient.cpp
+ * \brief: Cfdragcoeffabsgradtransient 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"
+/*}}}*/
+
+/*Cfdragcoeffabsgradtransient constructors, destructors :*/
+Cfdragcoeffabsgradtransient::Cfdragcoeffabsgradtransient(){/*{{{*/
+
+	this->definitionenum = -1;
+	this->name = NULL;
+	this->datatimes         = NULL;
+	this->passedflags   = NULL;
+	this->J = 0.;
+}
+/*}}}*/
+Cfdragcoeffabsgradtransient::Cfdragcoeffabsgradtransient(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;
+}
+/*}}}*/
+Cfdragcoeffabsgradtransient::Cfdragcoeffabsgradtransient(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;
+}
+/*}}}*/
+Cfdragcoeffabsgradtransient::~Cfdragcoeffabsgradtransient(){/*{{{*/
+	if(this->name)xDelete(this->name);
+	if(this->datatimes) xDelete(this->datatimes);
+	if(this->passedflags) xDelete(this->passedflags);
+}
+/*}}}*/
+/*Object virtual function resolutoin: */
+Object* Cfdragcoeffabsgradtransient::copy() {/*{{{*/
+	Cfdragcoeffabsgradtransient* mf = new Cfdragcoeffabsgradtransient(this->name,this->definitionenum, this->num_datatimes, this->datatimes,this->passedflags, this->J);
+	return (Object*) mf;
+}
+/*}}}*/
+void Cfdragcoeffabsgradtransient::DeepEcho(void){/*{{{*/
+	this->Echo();
+}
+/*}}}*/
+void Cfdragcoeffabsgradtransient::Echo(void){/*{{{*/
+	_printf_(" Cfdragcoeffabsgradtransient: " << name << " " << this->definitionenum << "\n");
+	_error_("not implemented yet");
+}
+/*}}}*/
+int Cfdragcoeffabsgradtransient::Id(void){/*{{{*/
+	return -1;
+}
+/*}}}*/
+void Cfdragcoeffabsgradtransient::Marshall(MarshallHandle* marshallhandle){/*{{{*/
+
+	/*ok, marshall operations: */
+   int object_enum=CfdragcoeffabsgradtransientEnum;
+   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 Cfdragcoeffabsgradtransient::ObjectEnum(void){/*{{{*/
+	return CfdragcoeffabsgradtransientEnum;
+}
+/*}}}*/
+/*Definition virtual function resolutoin: */
+int Cfdragcoeffabsgradtransient::DefinitionEnum(){/*{{{*/
+	return this->definitionenum;
+}
+/*}}}*/
+char* Cfdragcoeffabsgradtransient::Name(){/*{{{*/
+	char* name2=xNew<char>(strlen(this->name)+1);
+	xMemCpy(name2,this->name,strlen(this->name)+1);
+
+	return name2;
+}
+/*}}}*/
+IssmDouble Cfdragcoeffabsgradtransient::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->Cfdragcoeffabsgradtransient_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 Cfdragcoeffabsgradtransient::Cfdragcoeffabsgradtransient_Calculation(Element* element){/*{{{*/
+
+	int        domaintype,numcomponents,frictionlaw;
+	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        *drag_input   = NULL;
+
+	/* get the friction law: if 2-Weertman, 11-Schoof, 14-RegularizedCoulomb 15-RegularizedCoulomb2, which has a different names of C */
+	element->FindParam(&frictionlaw, FrictionLawEnum);
+	switch(frictionlaw) {
+		case 2:
+		case 11:
+		case 14:
+		case 15:
+			drag_input = basalelement->GetInput(FrictionCEnum); _assert_(drag_input);
+			break;
+		default:
+			drag_input = basalelement->GetInput(FrictionCoefficientEnum); _assert_(drag_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);
+		drag_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/Cfdragcoeffabsgradtransient.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Cfdragcoeffabsgradtransient.h	(revision 27902)
+++ /issm/trunk-jpl/src/c/classes/Cfdragcoeffabsgradtransient.h	(revision 27902)
@@ -0,0 +1,45 @@
+/*!\file Cfdragcoeffabsgradtransient.h
+ * \brief: header file for Cfdragcoeffabsgradtransient object
+ */
+
+#ifndef _CFDRAGCOEFFABSGRADTRANSIENT_H_
+#define _CFDRAGCOEFFABSGRADTRANSIENT_H_
+
+/*Headers:*/
+#include "./Definition.h"
+class FemModel;
+
+IssmDouble OutputDefinitionsResponsex(FemModel* femmodel,int output_enum);
+
+class Cfdragcoeffabsgradtransient: public Object, public Definition{
+
+	public: 
+
+		int         definitionenum;
+		char       *name;
+		int         num_datatimes;
+		IssmDouble *datatimes;
+		bool       *passedflags;
+		IssmDouble  J;
+
+		/*Cfdragcoeffabsgradtransient constructors, destructors :*/
+		Cfdragcoeffabsgradtransient();
+		Cfdragcoeffabsgradtransient(char* in_name, int in_definitionenum, int num_datatimes, IssmDouble* in_datatime);
+		Cfdragcoeffabsgradtransient(char* in_name, int in_definitionenum, int num_datatimes, IssmDouble* in_datatime, bool* in_timepassedflag, IssmDouble in_J);
+		~Cfdragcoeffabsgradtransient();
+
+		/*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  Cfdragcoeffabsgradtransient_Calculation(Element  *element);
+};
+#endif  /* _CFDRAGCOEFFABSGRADTRANSIENT_H_ */
Index: /issm/trunk-jpl/src/c/classes/classes.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/classes.h	(revision 27901)
+++ /issm/trunk-jpl/src/c/classes/classes.h	(revision 27902)
@@ -26,4 +26,5 @@
 #include "./Cfsurfacesquaretransient.h"
 #include "./Cfdragcoeffabsgrad.h"
+#include "./Cfdragcoeffabsgradtransient.h"
 #include "./Cfrheologybbarabsgrad.h"
 #include "./Cfsurfacelogvel.h"
Index: /issm/trunk-jpl/src/c/datastructures/DataSet.cpp
===================================================================
--- /issm/trunk-jpl/src/c/datastructures/DataSet.cpp	(revision 27901)
+++ /issm/trunk-jpl/src/c/datastructures/DataSet.cpp	(revision 27902)
@@ -276,4 +276,9 @@
 				this->AddObject(cfdragcoeff);
 			}
+			else if(obj_enum==CfdragcoeffabsgradtransientEnum){
+				Cfdragcoeffabsgradtransient* cfdragcoeff=new Cfdragcoeffabsgradtransient();
+				cfdragcoeff->Marshall(marshallhandle);
+				this->AddObject(cfdragcoeff);
+			}
 			else if(obj_enum==CfrheologybbarabsgradEnum){
 				Cfrheologybbarabsgrad* cfrheologybbarabsgrad=new Cfrheologybbarabsgrad();
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 27901)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateOutputDefinitions.cpp	(revision 27902)
@@ -373,4 +373,58 @@
 				/*}}}*/
 			}
+			else if (output_definition_enums[i]==CfdragcoeffabsgradtransientEnum){
+				/*Deal with cfdragcoeffabsgradtransient: {{{*/
+
+				/*cfdragcoeffabsgrad variables: */
+				int          num_cfdragcoeffabsgradtransients, test;
+				char**       cfdraggradt_name_s						= NULL;    
+				char**		 cfdraggradt_definitionstring_s		= NULL;    
+				IssmDouble** cfdraggradt_weights_s					= NULL;
+				int*         cfdraggradt_weights_M_s				= NULL;
+				int*         cfdraggradt_weights_N_s				= NULL;
+
+				/*Fetch name, model_string, observation, observation_string, etc ... (see src/m/classes/cfdragcoeffabsgrad.m): */
+				iomodel->FetchMultipleData(&cfdraggradt_name_s,&num_cfdragcoeffabsgradtransients,                                                        "md.cfdragcoeffabsgradtransient.name");
+				iomodel->FetchMultipleData(&cfdraggradt_definitionstring_s,&num_cfdragcoeffabsgradtransients,                                            "md.cfdragcoeffabsgradtransient.definitionstring");
+				iomodel->FetchMultipleData(&cfdraggradt_weights_s,&cfdraggradt_weights_M_s,&cfdraggradt_weights_N_s,&test,             "md.cfdragcoeffabsgradtransient.weights");
+					
+				for(j=0;j<num_cfdragcoeffabsgradtransients;j++){
+               
+					/*Check that we can use P1 inputs*/
+					if (cfdraggradt_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>(cfdraggradt_weights_N_s[j]);
+					for(int k=0;k<cfdraggradt_weights_N_s[j];k++) datatimes[k] = (cfdraggradt_weights_s[j])[cfdraggradt_weights_N_s[j]*(cfdraggradt_weights_M_s[j]-1)+k];
+
+					 /*First create a cfdragcoeffabsgradtransient object for that specific string:*/
+					output_definitions->AddObject(new Cfdragcoeffabsgradtransient(cfdraggradt_name_s[j],StringToEnumx(cfdraggradt_definitionstring_s[j]), cfdraggradt_weights_N_s[j], datatimes));
+
+					/*Now, for this particular cfdragcoeffabsgrad 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(cfdraggradt_definitionstring_s[j]),cfdraggradt_weights_s[j],inputs,iomodel,cfdraggradt_weights_M_s[j],cfdraggradt_weights_N_s[j],1,WeightsSurfaceObservationEnum,WeightsSurfaceObservationEnum);
+
+					}
+				}
+
+				/*Free resources:*/
+				for(j=0;j<num_cfdragcoeffabsgradtransients;j++){
+					char* string=NULL;
+					IssmDouble* matrix = NULL;
+
+					string = cfdraggradt_definitionstring_s[j];		xDelete<char>(string);
+					string = cfdraggradt_name_s[j];    xDelete<char>(string);
+					matrix = cfdraggradt_weights_s[j]; xDelete<IssmDouble>(matrix);
+				}
+				xDelete<char*>(cfdraggradt_name_s);
+				xDelete<char*>(cfdraggradt_definitionstring_s);
+				xDelete<IssmDouble*>(cfdraggradt_weights_s);
+				xDelete<int>(cfdraggradt_weights_M_s);
+				xDelete<int>(cfdraggradt_weights_N_s);
+				/*}}}*/
+			}
 			else if (output_definition_enums[i]==CfrheologybbarabsgradEnum){
 				/*Deal with cfrheologybbarabsgrad: {{{*/
Index: /issm/trunk-jpl/src/c/shared/Enum/Enum.vim
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 27901)
+++ /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 27902)
@@ -1418,4 +1418,5 @@
 syn keyword cConstant CalvingPollardEnum
 syn keyword cConstant CfdragcoeffabsgradEnum
+syn keyword cConstant CfdragcoeffabsgradtransientEnum
 syn keyword cConstant CfrheologybbarabsgradEnum
 syn keyword cConstant CfsurfacelogvelEnum
@@ -1795,4 +1796,5 @@
 syn keyword cType BoolParam
 syn keyword cType Cfdragcoeffabsgrad
+syn keyword cType Cfdragcoeffabsgradtransient
 syn keyword cType Cflevelsetmisfit
 syn keyword cType Cfrheologybbarabsgrad
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 27901)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 27902)
@@ -1417,4 +1417,5 @@
 	CalvingPollardEnum,
 	CfdragcoeffabsgradEnum,
+	CfdragcoeffabsgradtransientEnum,
 	CfrheologybbarabsgradEnum,
 	CfsurfacelogvelEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 27901)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 27902)
@@ -1420,4 +1420,5 @@
 		case CalvingPollardEnum : return "CalvingPollard";
 		case CfdragcoeffabsgradEnum : return "Cfdragcoeffabsgrad";
+		case CfdragcoeffabsgradtransientEnum : return "Cfdragcoeffabsgradtransient";
 		case CfrheologybbarabsgradEnum : return "Cfrheologybbarabsgrad";
 		case CfsurfacelogvelEnum : return "Cfsurfacelogvel";
Index: /issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim	(revision 27901)
+++ /issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim	(revision 27902)
@@ -1411,4 +1411,5 @@
 syn keyword juliaConstC CalvingPollardEnum
 syn keyword juliaConstC CfdragcoeffabsgradEnum
+syn keyword juliaConstC CfdragcoeffabsgradtransientEnum
 syn keyword juliaConstC CfrheologybbarabsgradEnum
 syn keyword juliaConstC CfsurfacelogvelEnum
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 27901)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 27902)
@@ -1453,4 +1453,5 @@
 	      else if (strcmp(name,"CalvingPollard")==0) return CalvingPollardEnum;
 	      else if (strcmp(name,"Cfdragcoeffabsgrad")==0) return CfdragcoeffabsgradEnum;
+	      else if (strcmp(name,"Cfdragcoeffabsgradtransient")==0) return CfdragcoeffabsgradtransientEnum;
 	      else if (strcmp(name,"Cfrheologybbarabsgrad")==0) return CfrheologybbarabsgradEnum;
 	      else if (strcmp(name,"Cfsurfacelogvel")==0) return CfsurfacelogvelEnum;
@@ -1489,9 +1490,9 @@
 	      else if (strcmp(name,"DependentObject")==0) return DependentObjectEnum;
 	      else if (strcmp(name,"DepthAverageAnalysis")==0) return DepthAverageAnalysisEnum;
-	      else if (strcmp(name,"DeviatoricStressErrorEstimator")==0) return DeviatoricStressErrorEstimatorEnum;
          else stage=13;
    }
    if(stage==13){
-	      if (strcmp(name,"Divergence")==0) return DivergenceEnum;
+	      if (strcmp(name,"DeviatoricStressErrorEstimator")==0) return DeviatoricStressErrorEstimatorEnum;
+	      else if (strcmp(name,"Divergence")==0) return DivergenceEnum;
 	      else if (strcmp(name,"Domain3Dsurface")==0) return Domain3DsurfaceEnum;
 	      else if (strcmp(name,"DoubleArrayInput")==0) return DoubleArrayInputEnum;
@@ -1612,9 +1613,9 @@
 	      else if (strcmp(name,"LoveKt")==0) return LoveKtEnum;
 	      else if (strcmp(name,"LoveLf")==0) return LoveLfEnum;
-	      else if (strcmp(name,"LoveLt")==0) return LoveLtEnum;
          else stage=14;
    }
    if(stage==14){
-	      if (strcmp(name,"LoveTidalHt")==0) return LoveTidalHtEnum;
+	      if (strcmp(name,"LoveLt")==0) return LoveLtEnum;
+	      else if (strcmp(name,"LoveTidalHt")==0) return LoveTidalHtEnum;
 	      else if (strcmp(name,"LoveTidalKt")==0) return LoveTidalKtEnum;
 	      else if (strcmp(name,"LoveTidalLt")==0) return LoveTidalLtEnum;
@@ -1735,9 +1736,9 @@
 	      else if (strcmp(name,"SealevelAbsolute")==0) return SealevelAbsoluteEnum;
 	      else if (strcmp(name,"SealevelEmotion")==0) return SealevelEmotionEnum;
-	      else if (strcmp(name,"SealevelchangePolarMotionX")==0) return SealevelchangePolarMotionXEnum;
          else stage=15;
    }
    if(stage==15){
-	      if (strcmp(name,"SealevelchangePolarMotionY")==0) return SealevelchangePolarMotionYEnum;
+	      if (strcmp(name,"SealevelchangePolarMotionX")==0) return SealevelchangePolarMotionXEnum;
+	      else if (strcmp(name,"SealevelchangePolarMotionY")==0) return SealevelchangePolarMotionYEnum;
 	      else if (strcmp(name,"SealevelchangePolarMotionZ")==0) return SealevelchangePolarMotionZEnum;
 	      else if (strcmp(name,"SealevelchangePolarMotion")==0) return SealevelchangePolarMotionEnum;
Index: /issm/trunk-jpl/src/m/classes/cfdragcoeffabsgradtransient.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/cfdragcoeffabsgradtransient.m	(revision 27902)
+++ /issm/trunk-jpl/src/m/classes/cfdragcoeffabsgradtransient.m	(revision 27902)
@@ -0,0 +1,69 @@
+%CFDRAGCOEFFABSGRADTRANSIENT class definition
+%
+%   Usage:
+%      cfdragcoeffabsgradtransient=cfdragcoeffabsgradtransient();
+%      cfdragcoeffabsgradtransient=cfdragcoeffabsgradtransient('name','SurfaceAltimetry',...
+%                    'definitionstring','Outputdefinition1',... 
+%                    'weights',ones(md.mesh.numberofvertices+1,1));
+%
+%
+
+classdef cfdragcoeffabsgradtransient
+	properties (SetAccess=public)
+		%cfdragcoeffabsgrad
+		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 = cfdragcoeffabsgradtransient(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('cfdragcoeffabsgrad 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 cfdragcoeffabsgradtransient 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 cfdragcoeffabsgradtransient');
+
+		end % }}}
+		function md = marshall(self,prefix,md,fid) % {{{
+
+		WriteData(fid,prefix,'data',self.name,'name','md.cfdragcoeffabsgradtransient.name','format','String');
+		WriteData(fid,prefix,'data',self.definitionstring,'name','md.cfdragcoeffabsgradtransient.definitionstring','format','String');
+		WriteData(fid,prefix,'data',self.weights,'name','md.cfdragcoeffabsgradtransient.weights','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
+		end % }}}
+	end
+end
