Index: /issm/trunk/src/c/objects/Elements/PentaRef.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/PentaRef.h	(revision 5628)
+++ /issm/trunk/src/c/objects/Elements/PentaRef.h	(revision 5629)
@@ -46,5 +46,7 @@
 		void GetLprimeStokes(double* LprimeStokes, double* xyz_list, double* gauss_tria, double* gauss);
 		void GetParameterValue(double* pvalue,double* plist,double* gauss);
+		void GetParameterValue(double* pvalue,double* plist,GaussTria* gauss){ISSMERROR("only PentaGauss are supported");};
 		void GetParameterDerivativeValue(double* pvalues, double* plist,double* xyz_list, double* gauss);
+		void GetParameterDerivativeValue(double* pvalues, double* plist,double* xyz_list, GaussTria* gauss){ISSMERROR("only PentaGauss are supported");};
 
 };
Index: /issm/trunk/src/c/objects/Elements/Tria.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 5628)
+++ /issm/trunk/src/c/objects/Elements/Tria.cpp	(revision 5629)
@@ -29,4 +29,5 @@
 	this->parameters=NULL;
 	this->results=NULL;
+
 }
 /*}}}*/
@@ -34,6 +35,5 @@
 Tria::Tria(int tria_id, int index, IoModel* iomodel,int nummodels)
 	:TriaRef(nummodels)
-	,TriaHook(nummodels,index+1,iomodel->numberofelements+1) //index+1: matice id, iomodel->numberofelements+1: matpar id
-                                                                  { //i is the element index
+	,TriaHook(nummodels,index+1,iomodel->numberofelements+1){
 	/*id: */
 	this->id=tria_id;
@@ -226,5 +226,9 @@
 /*}}}*/
 /*FUNCTION Tria::Id {{{1*/
-int    Tria::Id(){ return id; }
+int    Tria::Id(){
+	
+	return id;
+
+}
 /*}}}*/
 /*FUNCTION Tria::Marshall {{{1*/
@@ -356,45 +360,45 @@
 void  Tria::InputUpdateFromSolution(double* solution){
 
+	/*retrive parameters: */
 	int analysis_type;
-
-	/*retrive parameters: */
 	parameters->FindParam(&analysis_type,AnalysisTypeEnum);
 
 	/*Just branch to the correct InputUpdateFromSolution generator, according to the type of analysis we are carrying out: */
-	if (analysis_type==DiagnosticHorizAnalysisEnum){
-		InputUpdateFromSolutionDiagnosticHoriz( solution);
-	}
-	else if (analysis_type==DiagnosticHutterAnalysisEnum){
-		InputUpdateFromSolutionDiagnosticHoriz( solution);
-	}
-	else if (analysis_type==AdjointHorizAnalysisEnum){
-		InputUpdateFromSolutionAdjointHoriz( solution);
-	}
-	else if (analysis_type==BedSlopeXAnalysisEnum){
-		InputUpdateFromSolutionOneDof(solution,BedSlopeXEnum);
-	}
-	else if (analysis_type==BedSlopeYAnalysisEnum){
-		InputUpdateFromSolutionOneDof(solution,BedSlopeYEnum);
-	}
-	else if (analysis_type==SurfaceSlopeXAnalysisEnum){
-		InputUpdateFromSolutionOneDof(solution,SurfaceSlopeXEnum);
-	}
-	else if (analysis_type==SurfaceSlopeYAnalysisEnum){
-		InputUpdateFromSolutionOneDof(solution,SurfaceSlopeYEnum);
-	}
-	else if (analysis_type==PrognosticAnalysisEnum){
-		InputUpdateFromSolutionOneDof(solution,ThicknessEnum);
-	}
-	else if (analysis_type==BalancedthicknessAnalysisEnum){
-		InputUpdateFromSolutionOneDof(solution,ThicknessEnum);
-	}
-	else if (analysis_type==AdjointBalancedthicknessAnalysisEnum){
-		InputUpdateFromSolutionAdjointBalancedthickness( solution);
-	}
-	else if (analysis_type==BalancedvelocitiesAnalysisEnum){
-		InputUpdateFromSolutionOneDof(solution,VelEnum);
-	}
-	else{
-		ISSMERROR("analysis %i (%s) not supported yet",analysis_type,EnumToString(analysis_type));
+	switch(analysis_type){
+		case DiagnosticHorizAnalysisEnum:
+			InputUpdateFromSolutionDiagnosticHoriz( solution);
+			break;
+		case DiagnosticHutterAnalysisEnum:
+			InputUpdateFromSolutionDiagnosticHoriz( solution);
+			break;
+		case AdjointHorizAnalysisEnum:
+			InputUpdateFromSolutionAdjointHoriz( solution);
+			break;
+		case BedSlopeXAnalysisEnum:
+			InputUpdateFromSolutionOneDof(solution,BedSlopeXEnum);
+			break;
+		case BedSlopeYAnalysisEnum:
+			InputUpdateFromSolutionOneDof(solution,BedSlopeYEnum);
+			break;
+		case SurfaceSlopeXAnalysisEnum:
+			InputUpdateFromSolutionOneDof(solution,SurfaceSlopeXEnum);
+			break;
+		case SurfaceSlopeYAnalysisEnum:
+			InputUpdateFromSolutionOneDof(solution,SurfaceSlopeYEnum);
+			break;
+		case PrognosticAnalysisEnum:
+			InputUpdateFromSolutionOneDof(solution,ThicknessEnum);
+			break;
+		case BalancedthicknessAnalysisEnum:
+			InputUpdateFromSolutionOneDof(solution,ThicknessEnum);
+			break;
+		case AdjointBalancedthicknessAnalysisEnum:
+			InputUpdateFromSolutionAdjointBalancedthickness( solution);
+			break;
+		case BalancedvelocitiesAnalysisEnum:
+			InputUpdateFromSolutionOneDof(solution,VelEnum);
+			break;
+		default:
+			ISSMERROR("analysis %i (%s) not supported yet",analysis_type,EnumToString(analysis_type));
 	}
 }
@@ -428,5 +432,4 @@
 
 		default:
-
 			ISSMERROR("type %i (%s) not implemented yet",type,EnumToString(type));
 	}
@@ -446,6 +449,6 @@
 void  Tria::InputUpdateFromVectorDakota(double* vector, int name, int type){
 	
-	const int numgrids=3;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+	const int numvertices=3;
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 	int i,j;
 
@@ -572,6 +575,6 @@
 
 	int i;
-	const int numgrids=3;
-	int doflist[numgrids];
+	const int numvertices=3;
+	int doflist[numvertices];
 	double value;
 
@@ -615,8 +618,8 @@
 void  Tria::ComputeStrainRate(Vec eps){
 
-	int i;
-	const int numgrids=3;
-	int doflist[numgrids];
-	double value;
+	int       i;
+	const int numvertices = 3;
+	int       doflist[numvertices];
+	double    value;
 
 	/*plug local pressure values into global pressure vector: */
@@ -628,8 +631,7 @@
 /*FUNCTION Tria::SetCurrentConfiguration {{{1*/
 void  Tria::SetCurrentConfiguration(Elements* elementsin, Loads* loadsin, DataSet* nodesin, Materials* materialsin, Parameters* parametersin){
-
-	int analysis_counter;
 	
 	/*go into parameters and get the analysis_counter: */
+	int analysis_counter;
 	parametersin->FindParam(&analysis_counter,AnalysisCounterEnum);
 
@@ -645,8 +647,7 @@
 /*FUNCTION Tria::Configure {{{1*/
 void  Tria::Configure(Elements* elementsin, Loads* loadsin, DataSet* nodesin, Materials* materialsin, Parameters* parametersin){
-
-	int analysis_counter;
 	
 	/*go into parameters and get the analysis_counter: */
+	int analysis_counter;
 	parametersin->FindParam(&analysis_counter,AnalysisCounterEnum);
 
@@ -674,98 +675,66 @@
 double Tria::RegularizeInversion(){
 
-	int i;
-
-	/* output: */
-	double Jelem=0;
-
-	/* node data: */
-	const int    numgrids=3;
-	const int    numdof=2*numgrids;
+	/*constants: */
+	const int    numvertices=3;
 	const int    NDOF2=2;
-	double       xyz_list[numgrids][3];
-
-	/* grid data: */
-	double B[numgrids];
-
-	/* gaussian points: */
-	int     num_gauss,ig;
-	double* first_gauss_area_coord  =  NULL;
-	double* second_gauss_area_coord =  NULL;
-	double* third_gauss_area_coord  =  NULL;
-	double* gauss_weights           =  NULL;
-	double  gauss_weight;
-	double  gauss_l1l2l3[3];
-	double  B_gauss;
-	double  dhdt_gauss;
-
-	/* parameters: */
-	double  dk[NDOF2]; 
-	double  dB[NDOF2]; 
-	int    control_type;
-	double  cm_noisedmp;
-
-	/* Jacobian: */
-	double Jdet;
-
-	/*inputs: */
-	bool onwater;
-	bool shelf;
-
-	/*retrieve inputs :*/
+	const int    numdof=NDOF2*numvertices;
+
+	/* Intermediaries */
+	int        i,j,ig;
+	int        control_type;
+	bool       onwater,shelf;
+	double     Jelem = 0;
+	double     cm_noisedmp;
+	double     Jdet;
+	double     xyz_list[numvertices][3];
+	double     dk[NDOF2],dB[NDOF2];
+	GaussTria *gauss = NULL;
+
+	/*retrieve parameters and inputs*/
+	this->parameters->FindParam(&control_type,ControlTypeEnum);
+	this->parameters->FindParam(&cm_noisedmp,CmNoiseDmpEnum);
 	inputs->GetParameterValue(&onwater,ElementOnWaterEnum);
 	inputs->GetParameterValue(&shelf,ElementOnIceShelfEnum);
+	Input* drag_input=inputs->GetInput(DragCoefficientEnum);
+	Input* dhdt_input=inputs->GetInput(DhDtEnum);
+	Input* Bbar_input=matice->inputs->GetInput(RheologyBbarEnum);
 
 	/*If on water, return 0: */
-	if(onwater)return 0;
-
-	/*retrieve some parameters: */
-	this->parameters->FindParam(&control_type,ControlTypeEnum);
-	this->parameters->FindParam(&cm_noisedmp,CmNoiseDmpEnum);
-
-	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
-
-	/* Get gaussian points and weights (make this a statically initialized list of points? fstd): */
-	GaussLegendreTria( &num_gauss, &first_gauss_area_coord, &second_gauss_area_coord, &third_gauss_area_coord, &gauss_weights, 2);
-
-	/* Start  looping on the number of gaussian points: */
-	for (ig=0; ig<num_gauss; ig++){
-		/*Pick up the gaussian point: */
-		gauss_weight=*(gauss_weights+ig);
-		gauss_l1l2l3[0]=*(first_gauss_area_coord+ig); 
-		gauss_l1l2l3[1]=*(second_gauss_area_coord+ig);
-		gauss_l1l2l3[2]=*(third_gauss_area_coord+ig);
-
-		/* Get Jacobian determinant: */
-		GetJacobianDeterminant2d(&Jdet, &xyz_list[0][0],gauss_l1l2l3);
+	if(onwater) return 0;
+
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
+
+	/* Start looping on the number of gaussian points: */
+	gauss=new GaussTria(2);
+	for (ig=gauss->begin();ig<gauss->end();ig++){
+
+		gauss->GaussPoint(ig);
+
+		GetJacobianDeterminant2d(&Jdet, &xyz_list[0][0],gauss);
 
 		/*Add Tikhonov regularization term to misfit*/
 		if (control_type==DragCoefficientEnum){
-			if (shelf){
-				inputs->GetParameterDerivativeValue(&dk[0],&xyz_list[0][0],&gauss_l1l2l3[0],DragCoefficientEnum);
-				Jelem+=cm_noisedmp*1/2*(pow(dk[0],2)+pow(dk[1],2))*Jdet*gauss_weight;
-
-			}
+			if (!shelf) return 0; //only shelf?... TO BE CHECKED
+			ISSMASSERT(drag_input);
+			drag_input->GetParameterDerivativeValue(&dk[0],&xyz_list[0][0],gauss);
+			Jelem+=cm_noisedmp*1/2*(pow(dk[0],2)+pow(dk[1],2))*Jdet*gauss->weight;
 		}
 		else if (control_type==RheologyBbarEnum){
-			matice->inputs->GetParameterDerivativeValue(&dB[0], &xyz_list[0][0], &gauss_l1l2l3[0],RheologyBbarEnum);
-			Jelem+=cm_noisedmp*1/2*(pow(dB[0],2)+pow(dB[1],2))*Jdet*gauss_weight;
+			ISSMASSERT(Bbar_input);
+			Bbar_input->GetParameterDerivativeValue(&dB[0], &xyz_list[0][0], gauss);
+			Jelem+=cm_noisedmp*1/2*(pow(dB[0],2)+pow(dB[1],2))*Jdet*gauss->weight;
 		}
 		else if (control_type==DhDtEnum){
-			this->inputs->GetParameterDerivativeValue(&dB[0], &xyz_list[0][0], &gauss_l1l2l3[0],DhDtEnum);
-			Jelem+=cm_noisedmp*1/2*(pow(dB[0],2)+pow(dB[1],2))*Jdet*gauss_weight;
+			ISSMASSERT(dhdt_input);
+			dhdt_input->GetParameterDerivativeValue(&dB[0], &xyz_list[0][0], gauss);
+			Jelem+=cm_noisedmp*1/2*(pow(dB[0],2)+pow(dB[1],2))*Jdet*gauss->weight;
 		}
 		else{
 			ISSMERROR("%s%i","unsupported control type: ",control_type);
 		}
-
-	}
-
-	xfree((void**)&first_gauss_area_coord);
-	xfree((void**)&second_gauss_area_coord);
-	xfree((void**)&third_gauss_area_coord);
-	xfree((void**)&gauss_weights);
-
-	/*Return: */
+	}
+
+	/*clean-up and return: */
+	delete gauss;
 	return Jelem;
 }
@@ -774,7 +743,6 @@
 void  Tria::CreateKMatrix(Mat Kgg){
 
+	/*retrive parameters: */
 	int analysis_type;
-
-	/*retrive parameters: */
 	parameters->FindParam(&analysis_type,AnalysisTypeEnum);
 
@@ -884,6 +852,6 @@
 void  Tria::GetBedList(double* bedlist){
 	
-	const int numgrids=3;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+	const int numvertices=3;
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 	
 	inputs->GetParameterValues(bedlist,&gaussgrids[0][0],3,BedEnum);
@@ -953,6 +921,6 @@
 void Tria::GetThicknessList(double* thickness_list){
 
-	const int numgrids=3;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+	const int numvertices=3;
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 	inputs->GetParameterValues(thickness_list,&gaussgrids[0][0],3,ThicknessEnum);
 
@@ -1008,14 +976,14 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
 	const int    NDOF2=2;
-	const int    numdof=NDOF2*numgrids;
-	double       xyz_list[numgrids][3];
-	int          doflist1[numgrids];
-	double       dh1dh3[NDOF2][numgrids];
+	const int    numdof=NDOF2*numvertices;
+	double       xyz_list[numvertices][3];
+	int          doflist1[numvertices];
+	double       dh1dh3[NDOF2][numvertices];
 
 	/* grid data: */
-	double B[numgrids];
+	double B[numvertices];
 
 
@@ -1030,6 +998,6 @@
 
 	/*element vector at the gaussian points: */
-	double  grade_g[numgrids]={0.0};
-	double  grade_g_gaussian[numgrids];
+	double  grade_g[numvertices]={0.0};
+	double  grade_g_gaussian[numvertices];
 
 	/* Jacobian: */
@@ -1077,5 +1045,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList1(&doflist1[0]);
 
@@ -1128,5 +1096,5 @@
 
 		/*Build gradje_g_gaussian vector (actually -dJ/dB): */
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			//standard gradient dJ/dki
 			grade_g_gaussian[i]=-viscosity_complement*thickness*( (2*dvx[0]+dvy[1])*2*dadjx[0]+(dvx[1]+dvy[0])*(dadjx[1]+dadjy[0])+(2*dvy[1]+dvx[0])*2*dadjy[1])*Jdet*gauss_weight*l1l2l3[i]; 
@@ -1148,9 +1116,9 @@
 
 		/*Add grade_g_gaussian to grade_g: */
-		for( i=0; i<numgrids;i++) grade_g[i]+=grade_g_gaussian[i];
+		for( i=0; i<numvertices;i++) grade_g[i]+=grade_g_gaussian[i];
 	}
 
 	/*Add grade_g to global vector gradient: */
-	VecSetValues(gradient,numgrids,doflist1,(const double*)grade_g,ADD_VALUES);
+	VecSetValues(gradient,numvertices,doflist1,(const double*)grade_g,ADD_VALUES);
 
 	xfree((void**)&first_gauss_area_coord);
@@ -1166,10 +1134,10 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF2=2;
-	const int    numdof=NDOF2*numgrids;
-	double       xyz_list[numgrids][3];
-	int          doflist1[numgrids];
-	double       dh1dh3[NDOF2][numgrids];
+	const int    numdof=NDOF2*numvertices;
+	double       xyz_list[numvertices][3];
+	int          doflist1[numvertices];
+	double       dh1dh3[NDOF2][numvertices];
 
 	/* gaussian points: */
@@ -1193,6 +1161,6 @@
 
 	/*element vector at the gaussian points: */
-	double  grade_g[numgrids]={0.0};
-	double  grade_g_gaussian[numgrids];
+	double  grade_g[numvertices]={0.0};
+	double  grade_g_gaussian[numvertices];
 
 	/* Jacobian: */
@@ -1201,6 +1169,6 @@
 	/*nodal functions: */
 	double l1l2l3[3];
-	double    alpha2complement_list[numgrids];                          //TO BE DELETED
-	double    gauss[numgrids][numgrids] = {{1,0,0},{0,1,0},{0,0,1}}; //TO BE DELETED
+	double    alpha2complement_list[numvertices];                          //TO BE DELETED
+	double    gauss[numvertices][numvertices] = {{1,0,0},{0,1,0},{0,0,1}}; //TO BE DELETED
 
 	/* strain rate: */
@@ -1241,5 +1209,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList1(&doflist1[0]);
 
@@ -1249,5 +1217,5 @@
 
 	/*COMPUT alpha2_list (TO BE DELETED)*/
-	for(i=0;i<numgrids;i++){
+	for(i=0;i<numvertices;i++){
 		friction->GetAlphaComplement(&alpha2complement_list[i],&gauss[i][0],VxEnum,VyEnum);
 	}
@@ -1300,5 +1268,5 @@
 
 		/*Build gradje_g_gaussian vector (actually -dJ/ddrag): */
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 
 			//standard term dJ/dki
@@ -1320,9 +1288,9 @@
 		
 		/*Add gradje_g_gaussian vector to gradje_g: */
-		for( i=0; i<numgrids; i++)grade_g[i]+=grade_g_gaussian[i];
+		for( i=0; i<numvertices; i++)grade_g[i]+=grade_g_gaussian[i];
 	}
 
 	/*Add grade_g to global vector gradient: */
-	VecSetValues(gradient,numgrids,doflist1,(const double*)grade_g,ADD_VALUES);
+	VecSetValues(gradient,numvertices,doflist1,(const double*)grade_g,ADD_VALUES);
 
 	xfree((void**)&first_gauss_area_coord);
@@ -1340,10 +1308,10 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	int          doflist1[numgrids];
+	int          doflist1[numvertices];
 
 	/*Gauss*/
-	double  gauss[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+	double  gauss[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 
 	/* grid data: */
@@ -1351,5 +1319,5 @@
 
 	/*element vector at the gaussian points: */
-	double  gradient_g[numgrids];
+	double  gradient_g[numvertices];
 
 	/*Inputs*/
@@ -1363,5 +1331,5 @@
 
 	/* Start  looping on the vertices: */
-	for(i=0; i<numgrids;i++){
+	for(i=0; i<numvertices;i++){
 		adjoint_input->GetParameterValue(&lambda,&gauss[i][0]);
 		gradient_g[i]=-lambda;
@@ -1369,5 +1337,5 @@
 
 	/*Add grade_g to global vector gradient: */
-	VecSetValues(gradient,numgrids,doflist1,(const double*)gradient_g,INSERT_VALUES);
+	VecSetValues(gradient,numvertices,doflist1,(const double*)gradient_g,INSERT_VALUES);
 }
 /*}}}*/
@@ -1568,8 +1536,8 @@
 	int i;
 
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    numdofs=2;
 	double mass_flux=0;
-	double xyz_list[numgrids][3];
+	double xyz_list[numvertices][3];
 	double gauss_1[3];
 	double gauss_2[3];
@@ -1591,5 +1559,5 @@
 
 	/*Get xyz list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 
 	/*get area coordinates of 0 and 1 locations: */
@@ -1630,7 +1598,7 @@
 	int i;
 	int dim;
-	const int numgrids=3;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
-	double  vx_values[numgrids];
+	const int numvertices=3;
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
+	double  vx_values[numvertices];
 	double  maxabsvx;
 
@@ -1639,12 +1607,12 @@
 
 	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vx_values[0],&gaussgrids[0][0],numgrids,VxEnum);
+	inputs->GetParameterValues(&vx_values[0],&gaussgrids[0][0],numvertices,VxEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
+	if(process_units)UnitConversion(&vx_values[0],numvertices,IuToExtEnum,VxEnum,this->parameters);
 
 	/*now, compute maximum:*/
 	maxabsvx=fabs(vx_values[0]);
-	for(i=1;i<numgrids;i++){
+	for(i=1;i<numvertices;i++){
 		if (fabs(vx_values[i])>maxabsvx)maxabsvx=fabs(vx_values[i]);
 	}
@@ -1659,7 +1627,7 @@
 	int i;
 	int dim;
-	const int numgrids=3;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
-	double  vy_values[numgrids];
+	const int numvertices=3;
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
+	double  vy_values[numvertices];
 	double  maxabsvy;
 
@@ -1668,12 +1636,12 @@
 
 	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vy_values[0],&gaussgrids[0][0],numgrids,VyEnum);
+	inputs->GetParameterValues(&vy_values[0],&gaussgrids[0][0],numvertices,VyEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
+	if(process_units)UnitConversion(&vy_values[0],numvertices,IuToExtEnum,VyEnum,this->parameters);
 
 	/*now, compute maximum:*/
 	maxabsvy=fabs(vy_values[0]);
-	for(i=1;i<numgrids;i++){
+	for(i=1;i<numvertices;i++){
 		if (fabs(vy_values[i])>maxabsvy)maxabsvy=fabs(vy_values[i]);
 	}
@@ -1688,7 +1656,7 @@
 	int i;
 	int dim;
-	const int numgrids=3;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
-	double  vz_values[numgrids];
+	const int numvertices=3;
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
+	double  vz_values[numvertices];
 	double  maxabsvz;
 
@@ -1697,12 +1665,12 @@
 
 	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vz_values[0],&gaussgrids[0][0],numgrids,VzEnum);
+	inputs->GetParameterValues(&vz_values[0],&gaussgrids[0][0],numvertices,VzEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
+	if(process_units)UnitConversion(&vz_values[0],numvertices,IuToExtEnum,VzEnum,this->parameters);
 
 	/*now, compute maximum:*/
 	maxabsvz=fabs(vz_values[0]);
-	for(i=1;i<numgrids;i++){
+	for(i=1;i<numvertices;i++){
 		if (fabs(vz_values[i])>maxabsvz)maxabsvz=fabs(vz_values[i]);
 	}
@@ -1717,7 +1685,7 @@
 	int i;
 	int dim;
-	const int numgrids=3;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
-	double  vel_values[numgrids];
+	const int numvertices=3;
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
+	double  vel_values[numvertices];
 	double  maxvel;
 
@@ -1726,12 +1694,12 @@
 
 	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vel_values[0],&gaussgrids[0][0],numgrids,VelEnum);
+	inputs->GetParameterValues(&vel_values[0],&gaussgrids[0][0],numvertices,VelEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vel_values[0],numgrids,IuToExtEnum,VelEnum,this->parameters);
+	if(process_units)UnitConversion(&vel_values[0],numvertices,IuToExtEnum,VelEnum,this->parameters);
 
 	/*now, compute maximum:*/
 	maxvel=vel_values[0];
-	for(i=1;i<numgrids;i++){
+	for(i=1;i<numvertices;i++){
 		if (vel_values[i]>maxvel)maxvel=vel_values[i];
 	}
@@ -1747,7 +1715,7 @@
 	int i;
 	int dim;
-	const int numgrids=3;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
-	double  vx_values[numgrids];
+	const int numvertices=3;
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
+	double  vx_values[numvertices];
 	double  maxvx;
 
@@ -1756,12 +1724,12 @@
 
 	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vx_values[0],&gaussgrids[0][0],numgrids,VxEnum);
+	inputs->GetParameterValues(&vx_values[0],&gaussgrids[0][0],numvertices,VxEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
+	if(process_units)UnitConversion(&vx_values[0],numvertices,IuToExtEnum,VxEnum,this->parameters);
 
 	/*now, compute maximum:*/
 	maxvx=vx_values[0];
-	for(i=1;i<numgrids;i++){
+	for(i=1;i<numvertices;i++){
 		if (vx_values[i]>maxvx)maxvx=vx_values[i];
 	}
@@ -1777,7 +1745,7 @@
 	int i;
 	int dim;
-	const int numgrids=3;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
-	double  vy_values[numgrids];
+	const int numvertices=3;
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
+	double  vy_values[numvertices];
 	double  maxvy;
 
@@ -1786,12 +1754,12 @@
 
 	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vy_values[0],&gaussgrids[0][0],numgrids,VyEnum);
+	inputs->GetParameterValues(&vy_values[0],&gaussgrids[0][0],numvertices,VyEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
+	if(process_units)UnitConversion(&vy_values[0],numvertices,IuToExtEnum,VyEnum,this->parameters);
 
 	/*now, compute maximum:*/
 	maxvy=vy_values[0];
-	for(i=1;i<numgrids;i++){
+	for(i=1;i<numvertices;i++){
 		if (vy_values[i]>maxvy)maxvy=vy_values[i];
 	}
@@ -1807,7 +1775,7 @@
 	int i;
 	int dim;
-	const int numgrids=3;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
-	double  vz_values[numgrids];
+	const int numvertices=3;
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
+	double  vz_values[numvertices];
 	double  maxvz;
 
@@ -1816,12 +1784,12 @@
 
 	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vz_values[0],&gaussgrids[0][0],numgrids,VzEnum);
+	inputs->GetParameterValues(&vz_values[0],&gaussgrids[0][0],numvertices,VzEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
+	if(process_units)UnitConversion(&vz_values[0],numvertices,IuToExtEnum,VzEnum,this->parameters);
 
 	/*now, compute maximum:*/
 	maxvz=vz_values[0];
-	for(i=1;i<numgrids;i++){
+	for(i=1;i<numvertices;i++){
 		if (vz_values[i]>maxvz)maxvz=vz_values[i];
 	}
@@ -1837,7 +1805,7 @@
 	int i;
 	int dim;
-	const int numgrids=3;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
-	double  vel_values[numgrids];
+	const int numvertices=3;
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
+	double  vel_values[numvertices];
 	double  minvel;
 
@@ -1846,12 +1814,12 @@
 
 	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vel_values[0],&gaussgrids[0][0],numgrids,VelEnum);
+	inputs->GetParameterValues(&vel_values[0],&gaussgrids[0][0],numvertices,VelEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vel_values[0],numgrids,IuToExtEnum,VelEnum,this->parameters);
+	if(process_units)UnitConversion(&vel_values[0],numvertices,IuToExtEnum,VelEnum,this->parameters);
 
 	/*now, compute minimum:*/
 	minvel=vel_values[0];
-	for(i=1;i<numgrids;i++){
+	for(i=1;i<numvertices;i++){
 		if (vel_values[i]<minvel)minvel=vel_values[i];
 	}
@@ -1867,7 +1835,7 @@
 	int i;
 	int dim;
-	const int numgrids=3;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
-	double  vx_values[numgrids];
+	const int numvertices=3;
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
+	double  vx_values[numvertices];
 	double  minvx;
 
@@ -1876,12 +1844,12 @@
 
 	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vx_values[0],&gaussgrids[0][0],numgrids,VxEnum);
+	inputs->GetParameterValues(&vx_values[0],&gaussgrids[0][0],numvertices,VxEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vx_values[0],numgrids,IuToExtEnum,VxEnum,this->parameters);
+	if(process_units)UnitConversion(&vx_values[0],numvertices,IuToExtEnum,VxEnum,this->parameters);
 
 	/*now, compute minimum:*/
 	minvx=vx_values[0];
-	for(i=1;i<numgrids;i++){
+	for(i=1;i<numvertices;i++){
 		if (vx_values[i]<minvx)minvx=vx_values[i];
 	}
@@ -1897,7 +1865,7 @@
 	int i;
 	int dim;
-	const int numgrids=3;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
-	double  vy_values[numgrids];
+	const int numvertices=3;
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
+	double  vy_values[numvertices];
 	double  minvy;
 
@@ -1906,12 +1874,12 @@
 
 	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vy_values[0],&gaussgrids[0][0],numgrids,VyEnum);
+	inputs->GetParameterValues(&vy_values[0],&gaussgrids[0][0],numvertices,VyEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vy_values[0],numgrids,IuToExtEnum,VyEnum,this->parameters);
+	if(process_units)UnitConversion(&vy_values[0],numvertices,IuToExtEnum,VyEnum,this->parameters);
 
 	/*now, compute minimum:*/
 	minvy=vy_values[0];
-	for(i=1;i<numgrids;i++){
+	for(i=1;i<numvertices;i++){
 		if (vy_values[i]<minvy)minvy=vy_values[i];
 	}
@@ -1927,7 +1895,7 @@
 	int i;
 	int dim;
-	const int numgrids=3;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
-	double  vz_values[numgrids];
+	const int numvertices=3;
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
+	double  vz_values[numvertices];
 	double  minvz;
 
@@ -1936,12 +1904,12 @@
 
 	/*retrive velocity values at nodes */
-	inputs->GetParameterValues(&vz_values[0],&gaussgrids[0][0],numgrids,VzEnum);
+	inputs->GetParameterValues(&vz_values[0],&gaussgrids[0][0],numvertices,VzEnum);
 
 	/*process units if requested: */
-	if(process_units)UnitConversion(&vz_values[0],numgrids,IuToExtEnum,VzEnum,this->parameters);
+	if(process_units)UnitConversion(&vz_values[0],numvertices,IuToExtEnum,VzEnum,this->parameters);
 
 	/*now, compute minimum:*/
 	minvz=vz_values[0];
-	for(i=1;i<numgrids;i++){
+	for(i=1;i<numvertices;i++){
 		if (vz_values[i]<minvz)minvz=vz_values[i];
 	}
@@ -1961,8 +1929,8 @@
 
 	/* node data: */
-	const int    numgrids=3;
-	const int    numdof=1*numgrids;
+	const int    numvertices=3;
+	const int    numdof=1*numvertices;
 	const int    NDOF=1;
-	double       xyz_list[numgrids][3];
+	double       xyz_list[numvertices][3];
 
 	/* gaussian points: */
@@ -1974,5 +1942,5 @@
 	double  gauss_weight;
 	double  gauss_l1l2l3[3];
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 
 	/* parameters: */
@@ -1995,5 +1963,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 
 	/*Retrieve all inputs we will be needing: */
@@ -2043,17 +2011,17 @@
 
 	/* node data: */
-	const int    numgrids=3;
-	const int    numdof=2*numgrids;
+	const int    numvertices=3;
+	const int    numdof=2*numvertices;
 	const int    NDOF2=2;
-	double       xyz_list[numgrids][3];
+	double       xyz_list[numvertices][3];
 
 	/* grid data: */
-	double vx_list[numgrids];
-	double vy_list[numgrids];
-	double obs_vx_list[numgrids];
-	double obs_vy_list[numgrids];
-	double misfit_square_list[numgrids];
-	double misfit_list[numgrids];
-	double weights_list[numgrids];
+	double vx_list[numvertices];
+	double vy_list[numvertices];
+	double obs_vx_list[numvertices];
+	double obs_vy_list[numvertices];
+	double misfit_square_list[numvertices];
+	double misfit_list[numvertices];
+	double weights_list[numvertices];
 
 	/* gaussian points: */
@@ -2065,5 +2033,5 @@
 	double  gauss_weight;
 	double  gauss_l1l2l3[3];
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 
 	/* parameters: */
@@ -2086,5 +2054,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 
 	/* Recover input data: */
@@ -2116,12 +2084,12 @@
 	 *
 	 */
-	for (i=0;i<numgrids;i++){
+	for (i=0;i<numvertices;i++){
 		misfit_list[i]=0.5*(pow((vx_list[i]-obs_vx_list[i]),(double)2)+pow((vy_list[i]-obs_vy_list[i]),(double)2));
 	}
 	/*Process units: */
-	if(process_units)UnitConversion(&misfit_list[0],numgrids,IuToExtEnum,SurfaceAbsVelMisfitEnum,this->parameters);
+	if(process_units)UnitConversion(&misfit_list[0],numvertices,IuToExtEnum,SurfaceAbsVelMisfitEnum,this->parameters);
 
 	/*Apply weights to misfits*/
-	for (i=0;i<numgrids;i++){
+	for (i=0;i<numvertices;i++){
 		misfit_list[i]=weights_list[i]*misfit_list[i];
 	}
@@ -2166,17 +2134,17 @@
 
 	/* node data: */
-	const int    numgrids=3;
-	const int    numdof=2*numgrids;
+	const int    numvertices=3;
+	const int    numdof=2*numvertices;
 	const int    NDOF2=2;
-	double       xyz_list[numgrids][3];
+	double       xyz_list[numvertices][3];
 
 	/* grid data: */
-	double vx_list[numgrids];
-	double vy_list[numgrids];
-	double obs_vx_list[numgrids];
-	double obs_vy_list[numgrids];
-	double misfit_square_list[numgrids];
-	double misfit_list[numgrids];
-	double weights_list[numgrids];
+	double vx_list[numvertices];
+	double vy_list[numvertices];
+	double obs_vx_list[numvertices];
+	double obs_vy_list[numvertices];
+	double misfit_square_list[numvertices];
+	double misfit_list[numvertices];
+	double weights_list[numvertices];
 
 	/* gaussian points: */
@@ -2188,5 +2156,5 @@
 	double  gauss_weight;
 	double  gauss_l1l2l3[3];
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 
 	/* parameters: */
@@ -2213,5 +2181,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 
 	/* Recover input data: */
@@ -2243,5 +2211,5 @@
 	 *              obs                        obs                      
 	 */
-	for (i=0;i<numgrids;i++){
+	for (i=0;i<numvertices;i++){
 		scalex=pow(meanvel/(obs_vx_list[i]+epsvel),(double)2);
 		scaley=pow(meanvel/(obs_vy_list[i]+epsvel),(double)2);
@@ -2252,8 +2220,8 @@
 
 	/*Process units: */
-	if(process_units)UnitConversion(&misfit_list[0],numgrids,IuToExtEnum,SurfaceRelVelMisfitEnum,this->parameters);
+	if(process_units)UnitConversion(&misfit_list[0],numvertices,IuToExtEnum,SurfaceRelVelMisfitEnum,this->parameters);
 
 	/*Apply weights to misfits*/
-	for (i=0;i<numgrids;i++){
+	for (i=0;i<numvertices;i++){
 		misfit_list[i]=weights_list[i]*misfit_list[i];
 	}
@@ -2298,17 +2266,17 @@
 
 	/* node data: */
-	const int    numgrids=3;
-	const int    numdof=2*numgrids;
+	const int    numvertices=3;
+	const int    numdof=2*numvertices;
 	const int    NDOF2=2;
-	double       xyz_list[numgrids][3];
+	double       xyz_list[numvertices][3];
 
 	/* grid data: */
-	double vx_list[numgrids];
-	double vy_list[numgrids];
-	double obs_vx_list[numgrids];
-	double obs_vy_list[numgrids];
-	double misfit_square_list[numgrids];
-	double misfit_list[numgrids];
-	double weights_list[numgrids];
+	double vx_list[numvertices];
+	double vy_list[numvertices];
+	double obs_vx_list[numvertices];
+	double obs_vy_list[numvertices];
+	double misfit_square_list[numvertices];
+	double misfit_list[numvertices];
+	double weights_list[numvertices];
 
 	/* gaussian points: */
@@ -2320,5 +2288,5 @@
 	double  gauss_weight;
 	double  gauss_l1l2l3[3];
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 
 	/* parameters: */
@@ -2345,5 +2313,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 
 	/* Recover input data: */
@@ -2375,5 +2343,5 @@
 	 *                            obs
 	 */
-	for (i=0;i<numgrids;i++){
+	for (i=0;i<numvertices;i++){
 		velocity_mag=sqrt(pow(vx_list[i],(double)2)+pow(vy_list[i],(double)2))+epsvel; //epsvel to avoid velocity being nil.
 		obs_velocity_mag=sqrt(pow(obs_vx_list[i],(double)2)+pow(obs_vy_list[i],(double)2))+epsvel; //epsvel to avoid observed velocity being nil.
@@ -2382,8 +2350,8 @@
 
 	/*Process units: */
-	if(process_units)UnitConversion(&misfit_list[0],numgrids,IuToExtEnum,SurfaceLogVelMisfitEnum,this->parameters);
+	if(process_units)UnitConversion(&misfit_list[0],numvertices,IuToExtEnum,SurfaceLogVelMisfitEnum,this->parameters);
 
 	/*Apply weights to misfits*/
-	for (i=0;i<numgrids;i++){
+	for (i=0;i<numvertices;i++){
 		misfit_list[i]=weights_list[i]*misfit_list[i];
 	}
@@ -2428,17 +2396,17 @@
 
 	/* node data: */
-	const int    numgrids=3;
-	const int    numdof=2*numgrids;
+	const int    numvertices=3;
+	const int    numdof=2*numvertices;
 	const int    NDOF2=2;
-	double       xyz_list[numgrids][3];
+	double       xyz_list[numvertices][3];
 
 	/* grid data: */
-	double vx_list[numgrids];
-	double vy_list[numgrids];
-	double obs_vx_list[numgrids];
-	double obs_vy_list[numgrids];
-	double misfit_square_list[numgrids];
-	double misfit_list[numgrids];
-	double weights_list[numgrids];
+	double vx_list[numvertices];
+	double vy_list[numvertices];
+	double obs_vx_list[numvertices];
+	double obs_vy_list[numvertices];
+	double misfit_square_list[numvertices];
+	double misfit_list[numvertices];
+	double weights_list[numvertices];
 
 	/* gaussian points: */
@@ -2450,5 +2418,5 @@
 	double  gauss_weight;
 	double  gauss_l1l2l3[3];
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 
 	/* parameters: */
@@ -2477,5 +2445,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 
 	/* Recover input data: */
@@ -2507,5 +2475,5 @@
 	 *                              obs                       obs
 	 */
-	for (i=0;i<numgrids;i++){
+	for (i=0;i<numvertices;i++){
 		misfit_list[i]=0.5*pow(meanvel,(double)2)*(
 					pow(log((fabs(vx_list[i])+epsvel)/(fabs(obs_vx_list[i])+epsvel)),(double)2) +
@@ -2514,8 +2482,8 @@
 
 	/*Process units: */
-	if(process_units)UnitConversion(&misfit_list[0],numgrids,IuToExtEnum,SurfaceLogVxVyMisfitEnum,this->parameters);
+	if(process_units)UnitConversion(&misfit_list[0],numvertices,IuToExtEnum,SurfaceLogVxVyMisfitEnum,this->parameters);
 
 	/*Apply weights to misfits*/
-	for (i=0;i<numgrids;i++){
+	for (i=0;i<numvertices;i++){
 		misfit_list[i]=weights_list[i]*misfit_list[i];
 	}
@@ -2560,17 +2528,17 @@
 
 	/* node data: */
-	const int    numgrids=3;
-	const int    numdof=2*numgrids;
+	const int    numvertices=3;
+	const int    numdof=2*numvertices;
 	const int    NDOF2=2;
-	double       xyz_list[numgrids][3];
+	double       xyz_list[numvertices][3];
 
 	/* grid data: */
-	double vx_list[numgrids];
-	double vy_list[numgrids];
-	double obs_vx_list[numgrids];
-	double obs_vy_list[numgrids];
-	double misfit_square_list[numgrids];
-	double misfit_list[numgrids];
-	double weights_list[numgrids];
+	double vx_list[numvertices];
+	double vy_list[numvertices];
+	double obs_vx_list[numvertices];
+	double obs_vy_list[numvertices];
+	double misfit_square_list[numvertices];
+	double misfit_list[numvertices];
+	double weights_list[numvertices];
 
 	/* gaussian points: */
@@ -2582,5 +2550,5 @@
 	double  gauss_weight;
 	double  gauss_l1l2l3[3];
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 
 	/* parameters: */
@@ -2609,5 +2577,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 
 	/* Recover input data: */
@@ -2639,14 +2607,14 @@
 	 *      S                obs            obs
 	 */
-	for (i=0;i<numgrids;i++) misfit_square_list[i]=pow(vx_list[i]-obs_vx_list[i],2)+pow(vy_list[i]-obs_vx_list[i],2);
+	for (i=0;i<numvertices;i++) misfit_square_list[i]=pow(vx_list[i]-obs_vx_list[i],2)+pow(vy_list[i]-obs_vx_list[i],2);
 
 	/*Process units: */
-	if(process_units)UnitConversion(&misfit_square_list[0],numgrids,IuToExtEnum,SurfaceAverageVelMisfitEnum,this->parameters);
+	if(process_units)UnitConversion(&misfit_square_list[0],numvertices,IuToExtEnum,SurfaceAverageVelMisfitEnum,this->parameters);
 
 	/*Take the square root, and scale by surface: */
-	for (i=0;i<numgrids;i++)misfit_list[i]=pow(misfit_square_list[i],2)/S;
+	for (i=0;i<numvertices;i++)misfit_list[i]=pow(misfit_square_list[i],2)/S;
 
 	/*Apply weights to misfits*/
-	for (i=0;i<numgrids;i++){
+	for (i=0;i<numvertices;i++){
 		misfit_list[i]=weights_list[i]*misfit_list[i];
 	}
@@ -2760,6 +2728,6 @@
 
 	/* node data: */
-	int numgrids=3;
-	double xyz_list[numgrids][3];
+	int numvertices=3;
+	double xyz_list[numvertices][3];
 	double v13[3];
 	double v23[3];
@@ -2776,5 +2744,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 
 	for (i=0;i<3;i++){
@@ -3026,8 +2994,8 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	const int    numdof=NDOF1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 
@@ -3042,7 +3010,7 @@
 
 	/* matrices: */
-	double L[numgrids];
-	double B[2][numgrids];
-	double Bprime[2][numgrids];
+	double L[numvertices];
+	double B[2][numvertices];
+	double Bprime[2][numvertices];
 	double DL[2][2]={0.0};
 	double DLprime[2][2]={0.0};
@@ -3073,5 +3041,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -3192,8 +3160,8 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	const int    numdof=NDOF1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 
@@ -3208,6 +3176,6 @@
 
 	/* matrices: */
-	double B[2][numgrids];
-	double Bprime[2][numgrids];
+	double B[2][numvertices];
+	double Bprime[2][numvertices];
 	double DL[2][2]={0.0};
 	double DLprime[2][2]={0.0};
@@ -3227,5 +3195,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 	this->parameters->FindParam(&dim,DimEnum);
@@ -3293,10 +3261,10 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	const int    numdof=NDOF1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 
 	/* gaussian points: */
@@ -3310,7 +3278,7 @@
 
 	/* matrices: */
-	double L[numgrids];
-	double B[2][numgrids];
-	double Bprime[2][numgrids];
+	double L[numvertices];
+	double B[2][numvertices];
+	double Bprime[2][numvertices];
 	double DL[2][2]={0.0};
 	double DLprime[2][2]={0.0};
@@ -3347,5 +3315,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -3363,5 +3331,5 @@
 	/*Modify z so that it reflects the surface*/
 	surface_input->GetParameterValues(&surface_list[0],&gaussgrids[0][0],3);
-	for(i=0;i<numgrids;i++) xyz_list[i][2]=surface_list[i];
+	for(i=0;i<numvertices;i++) xyz_list[i][2]=surface_list[i];
 
 	/*Get normal vector to the surface*/
@@ -3473,7 +3441,7 @@
 
 	/* node data: */
-	const int    numgrids=3;
-	const int    numdof=2*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numvertices=3;
+	const int    numdof=2*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 
@@ -3533,5 +3501,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist,MacAyealApproximationEnum);
 
@@ -4041,7 +4009,7 @@
 	int    i;
 	int    connectivity;
-	const int numgrids=3;
+	const int numvertices=3;
 	const int NDOF2=2;
-	const int numdofs=numgrids*NDOF2;
+	const int numdofs=numvertices*NDOF2;
 	int*         doflist=NULL;
 
@@ -4078,8 +4046,8 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	const int    numdof=NDOF1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 
@@ -4114,5 +4082,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -4195,11 +4163,11 @@
 	int i,j;
 
-	const int  numgrids=3;
+	const int  numvertices=3;
 	const int  NDOF1=1;
-	const int  numdof=numgrids*NDOF1;
+	const int  numdof=numvertices*NDOF1;
 	int*       doflist=NULL;
 
 	/*Grid data: */
-	double     xyz_list[numgrids][3];
+	double     xyz_list[numvertices][3];
 
 	/*Material constants */
@@ -4228,5 +4196,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -4254,6 +4222,6 @@
 		MatrixMultiply(&tLD[0],numdof,1,0,&L[0],1,numdof,0,&Ke_gaussian[0][0],0);
 
-		for(i=0;i<numgrids;i++){
-			for(j=0;j<numgrids;j++){
+		for(i=0;i<numvertices;i++){
+			for(j=0;j<numvertices;j++){
 				K_terms[i][j]+=Ke_gaussian[i][j];
 			}
@@ -4278,8 +4246,8 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	const int    numdof=NDOF1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 	int          numberofdofspernode=1;
@@ -4295,7 +4263,7 @@
 
 	/* matrices: */
-	double L[numgrids];
-	double B[2][numgrids];
-	double Bprime[2][numgrids];
+	double L[numvertices];
+	double B[2][numvertices];
+	double Bprime[2][numvertices];
 	double DL[2][2]={0.0};
 	double DLprime[2][2]={0.0};
@@ -4330,5 +4298,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -4459,8 +4427,8 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	const int    numdof=NDOF1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 	int          numberofdofspernode=1;
@@ -4476,7 +4444,7 @@
 
 	/* matrices: */
-	double L[numgrids];
-	double B[2][numgrids];
-	double Bprime[2][numgrids];
+	double L[numvertices];
+	double B[2][numvertices];
+	double Bprime[2][numvertices];
 	double DL[2][2]={0.0};
 	double DLprime[2][2]={0.0};
@@ -4502,5 +4470,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -4632,8 +4600,8 @@
 	
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	const int    numdof=NDOF1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 
@@ -4656,5 +4624,5 @@
 	double  K_terms[numdof][numdof]={0.0};
 	double  Ke_gaussian[numdof][numdof]={0.0};
-	double  l1l2l3[numgrids];
+	double  l1l2l3[numvertices];
 	double     tl1l2l3D[3];
 	double  D_scalar;
@@ -4667,5 +4635,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -4726,8 +4694,8 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	const int    numdof=NDOF1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 	int          numberofdofspernode=1;
@@ -4743,6 +4711,6 @@
 
 	/* matrix */
-	double pe_g[numgrids]={0.0};
-	double L[numgrids];
+	double pe_g[numvertices]={0.0};
+	double L[numvertices];
 	double Jdettria;
 
@@ -4758,5 +4726,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -4810,8 +4778,8 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	const int    numdof=NDOF1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 	int          numberofdofspernode=1;
@@ -4827,6 +4795,6 @@
 
 	/* matrix */
-	double pe_g[numgrids]={0.0};
-	double L[numgrids];
+	double pe_g[numvertices]={0.0};
+	double L[numvertices];
 	double Jdettria;
 
@@ -4842,5 +4810,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -4894,8 +4862,8 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	const int    numdof=NDOF1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 	int          numberofdofspernode=1;
@@ -4911,6 +4879,6 @@
 
 	/* matrix */
-	double pe_g[numgrids]={0.0};
-	double L[numgrids];
+	double pe_g[numvertices]={0.0};
+	double L[numvertices];
 	double Jdettria;
 
@@ -4924,5 +4892,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -4974,8 +4942,8 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	const int    numdof=NDOF1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 
@@ -5000,5 +4968,5 @@
 
 	/* matrices: */
-	double L[numgrids];
+	double L[numvertices];
 
 	/*input parameters for structural analysis (diagnostic): */
@@ -5015,5 +4983,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -5056,5 +5024,5 @@
 
 		/*Build gaussian vector: */
-		for(i=0;i<numgrids;i++){
+		for(i=0;i<numvertices;i++){
 			pe_g_gaussian[i]=-Jdet*gauss_weight*(vx*dbdx+vy*dbdy-meltingvalue)*L[i];
 		}
@@ -5082,8 +5050,8 @@
 
 	/* node data: */
-	const int    numgrids=3;
-	const int    numdof=2*numgrids;
+	const int    numvertices=3;
+	const int    numdof=2*numvertices;
 	const int    NDOF2=2;
-	double       xyz_list[numgrids][3];
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 	
@@ -5133,5 +5101,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist,MacAyealApproximationEnum);
 
@@ -5169,5 +5137,5 @@
 		/*Build pe_g_gaussian vector: */
 		if(drag_type==1){
-			for (i=0;i<numgrids;i++){
+			for (i=0;i<numvertices;i++){
 				for (j=0;j<NDOF2;j++){
 					pe_g_gaussian[i*NDOF2+j]=(-driving_stress_baseline*slope[j]-plastic_stress)*Jdet*gauss_weight*l1l2l3[i]; 
@@ -5176,5 +5144,5 @@
 		}
 		else {
-			for (i=0;i<numgrids;i++){
+			for (i=0;i<numvertices;i++){
 				for (j=0;j<NDOF2;j++){
 					pe_g_gaussian[i*NDOF2+j]=-driving_stress_baseline*slope[j]*Jdet*gauss_weight*l1l2l3[i];
@@ -5205,7 +5173,7 @@
 
 	/* node data: */
-	const int    numgrids=3;
-	const int    numdof=1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numvertices=3;
+	const int    numdof=1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 
@@ -5238,5 +5206,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -5268,5 +5236,5 @@
 		weights_input->GetParameterValue(&weight, &gauss_l1l2l3[0]);
 
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			pe_g_gaussian[i]=(thicknessobs-thickness)*weight*Jdet*gauss_weight*l1l2l3[i]; 
 		}
@@ -5295,19 +5263,19 @@
 
 	/* node data: */
-	const int    numgrids=3;
-	const int    numdof=2*numgrids;
+	const int    numvertices=3;
+	const int    numdof=2*numvertices;
 	const int    NDOF2=2;
-	double       xyz_list[numgrids][3];
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 
 	/* grid data: */
-	double vx_list[numgrids];
-	double vy_list[numgrids];
-	double obs_vx_list[numgrids];
-	double obs_vy_list[numgrids];
-	double dux_list[numgrids];
-	double duy_list[numgrids];
-	double weights_list[numgrids];
+	double vx_list[numvertices];
+	double vy_list[numvertices];
+	double obs_vx_list[numvertices];
+	double obs_vy_list[numvertices];
+	double dux_list[numvertices];
+	double duy_list[numvertices];
+	double weights_list[numvertices];
 
 	/* gaussian points: */
@@ -5347,5 +5315,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -5388,5 +5356,5 @@
 		 *        du     obs
 		 */
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			dux_list[i]=obs_vx_list[i]-vx_list[i];
 			duy_list[i]=obs_vy_list[i]-vy_list[i];
@@ -5406,5 +5374,5 @@
 		 *               obs
 		 */
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			scalex=pow(meanvel/(obs_vx_list[i]+epsvel),2);
 			scaley=pow(meanvel/(obs_vy_list[i]+epsvel),2);
@@ -5428,5 +5396,5 @@
 		 *            
 		 */
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			velocity_mag=sqrt(pow(vx_list[i],2)+pow(vy_list[i],2))+epsvel; //epsvel to avoid velocity being nil.
 			obs_velocity_mag=sqrt(pow(obs_vx_list[i],2)+pow(obs_vy_list[i],2))+epsvel; //epsvel to avoid observed velocity being nil.
@@ -5447,5 +5415,5 @@
 		 *        du      S  2 sqrt(...)           obs
 		 */
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			scale=1.0/(S*sqrt(pow(vx_list[i]-obs_vx_list[i],2)+pow(vy_list[i]-obs_vx_list[i],2))+epsvel);
 			dux_list[i]=scale*(obs_vx_list[i]-vx_list[i]);
@@ -5464,5 +5432,5 @@
 		 *        du                         |u| + eps  |u|                           u + eps
 		 */
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			dux_list[i] = - pow(meanvel,(double)2)*(
 						log((fabs(vx_list[i])+epsvel)/(fabs(obs_vx_list[i])+epsvel)) * 1/(vx_list[i]+epsvel));
@@ -5477,5 +5445,5 @@
 
 	/*Apply weights to DU*/
-	for (i=0;i<numgrids;i++){
+	for (i=0;i<numvertices;i++){
 		dux_list[i]=weights_list[i]*dux_list[i];
 		duy_list[i]=weights_list[i]*duy_list[i];
@@ -5506,5 +5474,5 @@
 
 		/*compute Du*/
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			pe_g_gaussian[i*NDOF2+0]=dux*Jdet*gauss_weight*l1l2l3[i]; 
 			pe_g_gaussian[i*NDOF2+1]=duy*Jdet*gauss_weight*l1l2l3[i]; 
@@ -5534,19 +5502,19 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF4=4;
-	const int    numdof=NDOF4*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF4*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 
 	/* grid data: */
-	double vx_list[numgrids];
-	double vy_list[numgrids];
-	double obs_vx_list[numgrids];
-	double obs_vy_list[numgrids];
-	double dux_list[numgrids];
-	double duy_list[numgrids];
-	double weights_list[numgrids];
+	double vx_list[numvertices];
+	double vy_list[numvertices];
+	double obs_vx_list[numvertices];
+	double obs_vy_list[numvertices];
+	double dux_list[numvertices];
+	double duy_list[numvertices];
+	double weights_list[numvertices];
 
 	/* gaussian points: */
@@ -5586,5 +5554,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -5627,5 +5595,5 @@
 		 *        du     obs
 		 */
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			dux_list[i]=obs_vx_list[i]-vx_list[i];
 			duy_list[i]=obs_vy_list[i]-vy_list[i];
@@ -5645,5 +5613,5 @@
 		 *               obs
 		 */
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			scalex=pow(meanvel/(obs_vx_list[i]+epsvel),2);
 			scaley=pow(meanvel/(obs_vy_list[i]+epsvel),2);
@@ -5667,5 +5635,5 @@
 		 *            
 		 */
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			velocity_mag=sqrt(pow(vx_list[i],2)+pow(vy_list[i],2))+epsvel; //epsvel to avoid velocity being nil.
 			obs_velocity_mag=sqrt(pow(obs_vx_list[i],2)+pow(obs_vy_list[i],2))+epsvel; //epsvel to avoid observed velocity being nil.
@@ -5686,5 +5654,5 @@
 		 *        du      S  2 sqrt(...)           obs
 		 */
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			scale=1.0/(S*sqrt(pow(vx_list[i]-obs_vx_list[i],2)+pow(vy_list[i]-obs_vx_list[i],2))+epsvel);
 			dux_list[i]=scale*(obs_vx_list[i]-vx_list[i]);
@@ -5703,5 +5671,5 @@
 		 *        du                         |u| + eps  |u|                           u + eps
 		 */
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			dux_list[i] = - pow(meanvel,(double)2)*(
 						log((fabs(vx_list[i])+epsvel)/(fabs(obs_vx_list[i])+epsvel)) * 1/(vx_list[i]+epsvel));
@@ -5716,5 +5684,5 @@
 
 	/*Apply weights to DU*/
-	for (i=0;i<numgrids;i++){
+	for (i=0;i<numvertices;i++){
 		dux_list[i]=weights_list[i]*dux_list[i];
 		duy_list[i]=weights_list[i]*duy_list[i];
@@ -5745,5 +5713,5 @@
 
 		/*compute Du*/
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			pe_g[i*NDOF4+0]+=dux*Jdet*gauss_weight*l1l2l3[i];
 			pe_g[i*NDOF4+1]+=duy*Jdet*gauss_weight*l1l2l3[i]; 
@@ -5767,7 +5735,7 @@
 	/*Collapsed formulation: */
 	int       i;
-	const int numgrids=3;
+	const int numvertices=3;
 	const int NDOF2=2;
-	const int numdofs=NDOF2*numgrids;
+	const int numdofs=NDOF2*numvertices;
 	int*         doflist=NULL;
 	double    constant_part,ub,vb;
@@ -5784,5 +5752,5 @@
 	Input* slopey_input=NULL;
 	Input* thickness_input=NULL;
-	double gauss[numgrids][numgrids] = {{1,0,0},{0,1,0},{0,0,1}}; //TO BE DELETED
+	double gauss[numvertices][numvertices] = {{1,0,0},{0,1,0},{0,0,1}}; //TO BE DELETED
 
 	/*recover some inputs: */
@@ -5840,8 +5808,8 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	const int    numdof=NDOF1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 	int          numberofdofspernode=1;
@@ -5857,6 +5825,6 @@
 
 	/* matrix */
-	double pe_g[numgrids]={0.0};
-	double L[numgrids];
+	double pe_g[numvertices]={0.0};
+	double L[numvertices];
 	double Jdettria;
 
@@ -5876,5 +5844,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -5930,8 +5898,8 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	const int    numdof=NDOF1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 	int          numberofdofspernode=1;
@@ -5947,6 +5915,6 @@
 
 	/* matrix */
-	double pe_g[numgrids]={0.0};
-	double L[numgrids];
+	double pe_g[numvertices]={0.0};
+	double L[numvertices];
 	double Jdettria;
 
@@ -5964,5 +5932,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -6016,8 +5984,8 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF1=1;
-	const int    numdof=NDOF1*numgrids;
-	double       xyz_list[numgrids][3];
+	const int    numdof=NDOF1*numvertices;
+	double       xyz_list[numvertices][3];
 	int*         doflist=NULL;
 	
@@ -6050,5 +6018,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -6109,9 +6077,9 @@
 	int i,found;
 	
-	const int  numgrids=3;
+	const int  numvertices=3;
 	const int  NDOF1=1;
-	const int  numdof=numgrids*NDOF1;
+	const int  numdof=numvertices*NDOF1;
 	int*         doflist=NULL;
-	double       xyz_list[numgrids][3];
+	double       xyz_list[numvertices][3];
 
 	double mixed_layer_capacity;
@@ -6139,5 +6107,5 @@
 	double  Jdet;
 	double  P_terms[numdof]={0.0};
-	double  l1l2l3[numgrids];
+	double  l1l2l3[numvertices];
 
 	double  t_pmp;
@@ -6148,5 +6116,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -6214,9 +6182,9 @@
 	int i,found;
 	
-	const int  numgrids=3;
+	const int  numvertices=3;
 	const int  NDOF1=1;
-	const int  numdof=numgrids*NDOF1;
+	const int  numdof=numvertices*NDOF1;
 	int*       doflist=NULL;
-	double     xyz_list[numgrids][3];
+	double     xyz_list[numvertices][3];
 
 	double rho_ice;
@@ -6232,9 +6200,9 @@
 	double alpha2,vx,vy;
 	double geothermalflux_value;
-	double    alpha2_list[numgrids];                                       //TO BE DELETED
-	double    gauss[numgrids][numgrids] = {{1,0,0},{0,1,0},{0,0,1}}; //TO BE DELETED
-	double vx_list[numgrids]; //TO BE DELETED
-	double vy_list[numgrids]; //TO BE DELETED
-	double basalfriction_list[numgrids]; //TO BE DELETED
+	double    alpha2_list[numvertices];                                       //TO BE DELETED
+	double    gauss[numvertices][numvertices] = {{1,0,0},{0,1,0},{0,0,1}}; //TO BE DELETED
+	double vx_list[numvertices]; //TO BE DELETED
+	double vy_list[numvertices]; //TO BE DELETED
+	double basalfriction_list[numvertices]; //TO BE DELETED
 
 	/* gaussian points: */
@@ -6250,5 +6218,5 @@
 	double  Jdet;
 	double  P_terms[numdof]={0.0};
-	double  l1l2l3[numgrids];
+	double  l1l2l3[numvertices];
 	double  scalar;
 
@@ -6265,5 +6233,5 @@
 	
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList(&doflist);
 
@@ -6287,10 +6255,10 @@
 
 	/*COMPUT alpha2_list and basalfriction_list (TO BE DELETED)*/
-	for(i=0;i<numgrids;i++){
+	for(i=0;i<numvertices;i++){
 		friction->GetAlpha2(&alpha2_list[i],&gauss[i][0],VxEnum,VyEnum,VzEnum); //TO BE DELETED
 	}
 	vx_input->GetParameterValues(&vx_list[0],&gauss[0][0],3); //TO BE DELETED
 	vy_input->GetParameterValues(&vy_list[0],&gauss[0][0],3); //TO BE DELETED
-	for(i=0;i<numgrids;i++){
+	for(i=0;i<numvertices;i++){
 		basalfriction_list[i]=alpha2_list[i]*(pow(vx_list[i],(double)2.0)+pow(vy_list[i],(double)2.0)); //TO BE DELETED
 	}
@@ -6347,10 +6315,10 @@
 
 	double area=0;
-	const int    numgrids=3;
-	double xyz_list[numgrids][3];
+	const int    numvertices=3;
+	double xyz_list[numvertices][3];
 	double x1,y1,x2,y2,x3,y3;
 
 	/*Get xyz list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	x1=xyz_list[0][0]; y1=xyz_list[0][1];
 	x2=xyz_list[1][0]; y2=xyz_list[1][1];
@@ -6365,6 +6333,6 @@
 	/*Intermediaries*/
 	double    area = 0;
-	const int numgrids = 3;
-	double    xyz_list[numgrids][3];
+	const int numvertices = 3;
+	double    xyz_list[numvertices][3];
 	double    x1,y1,x2,y2,x3,y3;
 
@@ -6373,5 +6341,5 @@
 
 	/*Get xyz list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	x1=xyz_list[0][0]; y1=xyz_list[0][1];
 	x2=xyz_list[1][0]; y2=xyz_list[1][1];
@@ -6735,9 +6703,9 @@
 
 	/* node data: */
-	const int    numgrids=3;
+	const int    numvertices=3;
 	const int    NDOF2=2;
-	double       xyz_list[numgrids][3];
-	int          doflist1[numgrids];
-	double       dh1dh3[NDOF2][numgrids];
+	double       xyz_list[numvertices][3];
+	int          doflist1[numvertices];
+	double       dh1dh3[NDOF2][numvertices];
 
 	/* grid data: */
@@ -6754,5 +6722,5 @@
 	double  gauss_weight;
 	double  gauss_l1l2l3[3];
-	double  gaussgrids[numgrids][numgrids]={{1,0,0},{0,1,0},{0,0,1}};
+	double  gaussgrids[numvertices][numvertices]={{1,0,0},{0,1,0},{0,0,1}};
 
 	/* parameters: */
@@ -6765,6 +6733,6 @@
 
 	/*element vector at the gaussian points: */
-	double  grade_g[numgrids]={0.0};
-	double  grade_g_gaussian[numgrids];
+	double  grade_g[numvertices]={0.0};
+	double  grade_g_gaussian[numvertices];
 
 	/* Jacobian: */
@@ -6808,5 +6776,5 @@
 
 	/* Get node coordinates and dof list: */
-	GetVerticesCoordinates(&xyz_list[0][0], nodes, numgrids);
+	GetVerticesCoordinates(&xyz_list[0][0], nodes, numvertices);
 	GetDofList1(&doflist1[0]);
 
@@ -6861,5 +6829,5 @@
 
 		/*Build gradje_g_gaussian vector (actually -dJ/ddrag): */
-		for (i=0;i<numgrids;i++){
+		for (i=0;i<numvertices;i++){
 			//standard gradient dJ/dki
 			grade_g_gaussian[i]=(
@@ -6884,9 +6852,9 @@
 
 		/*Add gradje_g_gaussian vector to gradje_g: */
-		for( i=0; i<numgrids; i++)grade_g[i]+=grade_g_gaussian[i];
+		for( i=0; i<numvertices; i++)grade_g[i]+=grade_g_gaussian[i];
 	}
 
 	/*Add grade_g to global vector gradient: */
-	VecSetValues(gradient,numgrids,doflist1,(const double*)grade_g,ADD_VALUES);
+	VecSetValues(gradient,numvertices,doflist1,(const double*)grade_g,ADD_VALUES);
 
 	/*Add grade_g to the inputs of this element: */
Index: /issm/trunk/src/c/objects/Elements/TriaRef.cpp
===================================================================
--- /issm/trunk/src/c/objects/Elements/TriaRef.cpp	(revision 5628)
+++ /issm/trunk/src/c/objects/Elements/TriaRef.cpp	(revision 5629)
@@ -359,6 +359,20 @@
 }
 /*}}}*/
-/*FUNCTION TriaRef::GetJacobianInvert {{{1*/
+/*FUNCTION TriaRef::GetJacobianInvert(double*  Jinv, double* xyz_list,double* gauss) {{{1*/
 void TriaRef::GetJacobianInvert(double*  Jinv, double* xyz_list,double* gauss){
+
+	/*Jacobian*/
+	double J[2][2];
+
+	/*Call Jacobian routine to get the jacobian:*/
+	GetJacobian(&J[0][0], xyz_list, gauss);
+
+	/*Invert Jacobian matrix: */
+	Matrix2x2Invert(Jinv,&J[0][0]);
+
+}
+/*}}}*/
+/*FUNCTION TriaRef::GetJacobianInvert(double*  Jinv, double* xyz_list,GaussTria* gauss) {{{1*/
+void TriaRef::GetJacobianInvert(double*  Jinv, double* xyz_list,GaussTria* gauss){
 
 	/*Jacobian*/
@@ -393,5 +407,5 @@
 }
 /*}}}*/
-/*FUNCTION TriaRef::GetNodalFunctionsDerivatives {{{1*/
+/*FUNCTION TriaRef::GetNodalFunctionsDerivatives(double* dh1dh3,double* xyz_list, double* gauss) {{{1*/
 void TriaRef::GetNodalFunctionsDerivatives(double* dh1dh3,double* xyz_list, double* gauss){
 
@@ -422,5 +436,34 @@
 }
 /*}}}*/
-/*FUNCTION TriaRef::GetNodalFunctionsDerivativesReference {{{1*/
+/*FUNCTION TriaRef::GetNodalFunctionsDerivatives(double* dh1dh3,double* xyz_list, GaussTria* gauss) {{{1*/
+void TriaRef::GetNodalFunctionsDerivatives(double* dh1dh3,double* xyz_list, GaussTria* gauss){
+
+	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
+	 * actual coordinate system): */
+	int       i;
+	const int NDOF2    = 2;
+	const int numgrids = 3;
+	double    dh1dh3_ref[NDOF2][numgrids];
+	double    Jinv[NDOF2][NDOF2];
+
+	/*Get derivative values with respect to parametric coordinate system: */
+	GetNodalFunctionsDerivativesReference(&dh1dh3_ref[0][0], gauss); 
+
+	/*Get Jacobian invert: */
+	GetJacobianInvert(&Jinv[0][0], xyz_list, gauss);
+
+	/*Build dh1dh3: 
+	 *
+	 * [dhi/dx]= Jinv*[dhi/dr]
+	 * [dhi/dy]       [dhi/ds]
+	 */
+	for (i=0;i<numgrids;i++){
+		dh1dh3[numgrids*0+i]=Jinv[0][0]*dh1dh3_ref[0][i]+Jinv[0][1]*dh1dh3_ref[1][i];
+		dh1dh3[numgrids*1+i]=Jinv[1][0]*dh1dh3_ref[0][i]+Jinv[1][1]*dh1dh3_ref[1][i];
+	}
+
+}
+/*}}}*/
+/*FUNCTION TriaRef::GetNodalFunctionsDerivativesReference(double* dl1dl3,double* gauss) {{{1*/
 void TriaRef::GetNodalFunctionsDerivativesReference(double* dl1dl3,double* gauss){
 
@@ -445,5 +488,28 @@
 }
 /*}}}*/
-/*FUNCTION TriaRef::GetParameterDerivativeValue {{{1*/
+/*FUNCTION TriaRef::GetNodalFunctionsDerivativesReference(double* dl1dl3,GaussTria* gauss) {{{1*/
+void TriaRef::GetNodalFunctionsDerivativesReference(double* dl1dl3,GaussTria* gauss){
+
+	/*This routine returns the values of the nodal functions derivatives  (with respect to the 
+	 * natural coordinate system) at the gaussian point. */
+
+	const int NDOF2=2;
+	const int numgrids=3;
+
+	/*First nodal function: */
+	*(dl1dl3+numgrids*0+0)=-0.5; 
+	*(dl1dl3+numgrids*1+0)=-1.0/(2.0*SQRT3);
+
+	/*Second nodal function: */
+	*(dl1dl3+numgrids*0+1)=0.5;
+	*(dl1dl3+numgrids*1+1)=-1.0/(2.0*SQRT3);
+
+	/*Third nodal function: */
+	*(dl1dl3+numgrids*0+2)=0;
+	*(dl1dl3+numgrids*1+2)=1.0/SQRT3;
+
+}
+/*}}}*/
+/*FUNCTION TriaRef::GetParameterDerivativeValue(double* p, double* plist,double* xyz_list, double* gauss) {{{1*/
 void TriaRef::GetParameterDerivativeValue(double* p, double* plist,double* xyz_list, double* gauss){
 
@@ -468,5 +534,28 @@
 }
 /*}}}*/
-/*FUNCTION TriaRef::GetParameterValue{{{1*/
+/*FUNCTION TriaRef::GetParameterDerivativeValue(double* p, double* plist,double* xyz_list, GaussTria* gauss) {{{1*/
+void TriaRef::GetParameterDerivativeValue(double* p, double* plist,double* xyz_list, GaussTria* gauss){
+
+	/*From node values of parameter p (plist[0],plist[1],plist[2]), return parameter derivative value at gaussian 
+	 * point specified by gauss_l1l2l3:
+	 *   dp/dx=plist[0]*dh1/dx+plist[1]*dh2/dx+plist[2]*dh3/dx
+	 *   dp/dx=plist[0]*dh1/dx+plist[1]*dh2/dx+plist[2]*dh3/dx
+	 *
+	 * p is a vector of size 2x1 already allocated.
+	 */
+
+	/*Nodal Derivatives*/
+	double dh1dh3[2][3]; //nodal derivative functions in actual coordinate system.
+
+	/*Get dh1dh2dh3 in actual coordinate system: */
+	GetNodalFunctionsDerivatives(&dh1dh3[0][0],xyz_list, gauss);
+
+	/*Assign values*/
+	*(p+0)=plist[0]*dh1dh3[0][0]+plist[1]*dh1dh3[0][1]+plist[2]*dh1dh3[0][2];
+	*(p+1)=plist[0]*dh1dh3[1][0]+plist[1]*dh1dh3[1][1]+plist[2]*dh1dh3[1][2];
+
+}
+/*}}}*/
+/*FUNCTION TriaRef::GetParameterValue(double* p, double* plist, double* gauss){{{1*/
 void TriaRef::GetParameterValue(double* p, double* plist, double* gauss){
 
@@ -484,2 +573,18 @@
 }
 /*}}}*/
+/*FUNCTION TriaRef::GetParameterValue(double* p, double* plist, GaussTria* gauss){{{1*/
+void TriaRef::GetParameterValue(double* p, double* plist, GaussTria* gauss){
+
+	/*From node values of parameter p (plist[0],plist[1],plist[2]), return parameter value at gaussian 
+	 * point specifie by gauss: */
+
+	/*nodal functions annd output: */
+	double l1l2l3[3];
+
+	/*Get nodal functions*/
+	GetNodalFunctions(l1l2l3, gauss);
+
+	/*Get parameter*/
+	*p=l1l2l3[0]*plist[0]+l1l2l3[1]*plist[1]+l1l2l3[2]*plist[2];
+}
+/*}}}*/
Index: /issm/trunk/src/c/objects/Elements/TriaRef.h
===================================================================
--- /issm/trunk/src/c/objects/Elements/TriaRef.h	(revision 5628)
+++ /issm/trunk/src/c/objects/Elements/TriaRef.h	(revision 5629)
@@ -37,10 +37,15 @@
 		void GetJacobianDeterminant3d(double* Jdet, double* xyz_list,double* gauss);
 		void GetJacobianInvert(double*  Jinv, double* xyz_list,double* gauss);
+		void GetJacobianInvert(double*  Jinv, double* xyz_list,GaussTria* gauss);
 		void GetNodalFunctions(double* l1l2l3, double* gauss);
 		void GetNodalFunctions(double* l1l2l3,GaussTria* gauss);
 		void GetNodalFunctionsDerivatives(double* l1l2l3,double* xyz_list, double* gauss);
+		void GetNodalFunctionsDerivatives(double* l1l2l3,double* xyz_list, GaussTria* gauss);
 		void GetNodalFunctionsDerivativesReference(double* dl1dl3,double* gauss);
+		void GetNodalFunctionsDerivativesReference(double* dl1dl3,GaussTria* gauss);
 		void GetParameterValue(double* pp, double* plist, double* gauss);
+		void GetParameterValue(double* pp, double* plist, GaussTria* gauss);
 		void GetParameterDerivativeValue(double* pp, double* plist,double* xyz_list, double* gauss);
+		void GetParameterDerivativeValue(double* pp, double* plist,double* xyz_list, GaussTria* gauss);
 
 };
Index: /issm/trunk/src/c/objects/Inputs/BoolInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/BoolInput.cpp	(revision 5628)
+++ /issm/trunk/src/c/objects/Inputs/BoolInput.cpp	(revision 5629)
@@ -169,9 +169,15 @@
 void BoolInput::GetParameterValue(double* pvalue,double* gauss){ISSMERROR(" not supported yet!");}
 /*}}}*/
+/*FUNCTION BoolInput::GetParameterValue(double* pvalue,GaussTria* gauss){{{1*/
+void BoolInput::GetParameterValue(double* pvalue,GaussTria* gauss){ISSMERROR(" not supported yet!");}
+/*}}}*/
 /*FUNCTION BoolInput::GetParameterValues{{{1*/
 void BoolInput::GetParameterValues(double* values,double* gauss_pointers, int numgauss){ISSMERROR(" not supported yet!");}
 /*}}}*/
-/*FUNCTION BoolInput::GetParameterDerivativeValue{{{1*/
+/*FUNCTION BoolInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, double* gauss){{{1*/
 void BoolInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, double* gauss){ISSMERROR(" not supported yet!");}
+/*}}}*/
+/*FUNCTION BoolInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss){{{1*/
+void BoolInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss){ISSMERROR(" not supported yet!");}
 /*}}}*/
 /*FUNCTION BoolInput::ChangeEnum{{{1*/
Index: /issm/trunk/src/c/objects/Inputs/BoolInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/BoolInput.h	(revision 5628)
+++ /issm/trunk/src/c/objects/Inputs/BoolInput.h	(revision 5629)
@@ -11,4 +11,5 @@
 #include "./Input.h"
 #include "../../include/include.h"
+class GaussTria;
 /*}}}*/
 
@@ -47,6 +48,8 @@
 		void GetParameterValue(double* pvalue);
 		void GetParameterValue(double* pvalue,double* gauss);
+		void GetParameterValue(double* pvalue,GaussTria* gauss);
 		void GetParameterValues(double* values,double* gauss_pointers, int numgauss);
 		void GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, double* gauss);
+		void GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss);
 		void GetParameterAverage(double* pvalue){ISSMERROR("not implemented yet");};
 		void GetVxStrainRate2d(double* epsilonvx,double* xyz_list, double* gauss){ISSMERROR("not implemented yet");};
Index: /issm/trunk/src/c/objects/Inputs/DoubleInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/DoubleInput.cpp	(revision 5628)
+++ /issm/trunk/src/c/objects/Inputs/DoubleInput.cpp	(revision 5629)
@@ -182,9 +182,15 @@
 void DoubleInput::GetParameterValue(double* pvalue,double* gauss){ISSMERROR(" not supported yet!");}
 /*}}}*/
+/*FUNCTION DoubleInput::GetParameterValue(double* pvalue,GaussTria* gauss){{{1*/
+void DoubleInput::GetParameterValue(double* pvalue,GaussTria* gauss){ISSMERROR(" not supported yet!");}
+/*}}}*/
 /*FUNCTION DoubleInput::GetParameterValues{{{1*/
 void DoubleInput::GetParameterValues(double* values,double* gauss_pointers, int numgauss){ISSMERROR(" not supported yet!");}
 /*}}}*/
-/*FUNCTION DoubleInput::GetParameterDerivativeValue{{{1*/
+/*FUNCTION DoubleInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, double* gauss){{{1*/
 void DoubleInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, double* gauss){ISSMERROR(" not supported yet!");}
+/*}}}*/
+/*FUNCTION DoubleInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss){{{1*/
+void DoubleInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss){ISSMERROR(" not supported yet!");}
 /*}}}*/
 /*FUNCTION DoubleInput::ChangeEnum{{{1*/
Index: /issm/trunk/src/c/objects/Inputs/DoubleInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/DoubleInput.h	(revision 5628)
+++ /issm/trunk/src/c/objects/Inputs/DoubleInput.h	(revision 5629)
@@ -11,4 +11,5 @@
 #include "./Input.h"
 #include "../../include/include.h"
+class GaussTria;
 /*}}}*/
 
@@ -46,6 +47,8 @@
 		void GetParameterValue(double* pvalue);
 		void GetParameterValue(double* pvalue,double* gauss);
+		void GetParameterValue(double* pvalue,GaussTria* gauss);
 		void GetParameterValues(double* values,double* gauss_pointers, int numgauss);
 		void GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, double* gauss);
+		void GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss);
 		void GetParameterAverage(double* pvalue);
 		void GetVxStrainRate2d(double* epsilonvx,double* xyz_list, double* gauss){ISSMERROR("not implemented yet");};
Index: /issm/trunk/src/c/objects/Inputs/Input.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/Input.h	(revision 5628)
+++ /issm/trunk/src/c/objects/Inputs/Input.h	(revision 5629)
@@ -12,4 +12,5 @@
 class Node;
 class ElementResult;
+class GaussTria;
 /*}}}*/
 
@@ -25,6 +26,8 @@
 		virtual void GetParameterValue(double* pvalue)=0;
 		virtual void GetParameterValue(double* pvalue,double* gauss)=0;
+		virtual void GetParameterValue(double* pvalue,GaussTria* gauss)=0;
 		virtual void GetParameterValues(double* values,double* gauss_pointers, int numgauss)=0;
 		virtual void GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, double* gauss)=0;
+		virtual void GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss)=0;
 		virtual void GetParameterAverage(double* pvalue)=0;
 		virtual void GetVxStrainRate2d(double* epsilonvx,double* xyz_list, double* gauss)=0;
Index: /issm/trunk/src/c/objects/Inputs/IntInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/IntInput.cpp	(revision 5628)
+++ /issm/trunk/src/c/objects/Inputs/IntInput.cpp	(revision 5629)
@@ -170,9 +170,15 @@
 void IntInput::GetParameterValue(double* pvalue,double* gauss){ISSMERROR(" not supported yet!");}
 /*}}}*/
+/*FUNCTION IntInput::GetParameterValue(double* pvalue,GaussTria* gauss){{{1*/
+void IntInput::GetParameterValue(double* pvalue,GaussTria* gauss){ISSMERROR(" not supported yet!");}
+/*}}}*/
 /*FUNCTION IntInput::GetParameterValues{{{1*/
 void IntInput::GetParameterValues(double* values,double* gauss_pointers, int numgauss){ISSMERROR(" not supported yet!");}
 /*}}}*/
-/*FUNCTION IntInput::GetParameterDerivativeValue{{{1*/
+/*FUNCTION IntInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, double* gauss){{{1*/
 void IntInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, double* gauss){ISSMERROR(" not supported yet!");}
+/*}}}*/
+/*FUNCTION IntInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss){{{1*/
+void IntInput::GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss){ISSMERROR(" not supported yet!");}
 /*}}}*/
 /*FUNCTION IntInput::ChangeEnum{{{1*/
Index: /issm/trunk/src/c/objects/Inputs/IntInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/IntInput.h	(revision 5628)
+++ /issm/trunk/src/c/objects/Inputs/IntInput.h	(revision 5629)
@@ -11,4 +11,5 @@
 #include "./Input.h"
 #include "../../include/include.h"
+class GaussTria;
 /*}}}*/
 
@@ -47,6 +48,8 @@
 		void GetParameterValue(double* pvalue);
 		void GetParameterValue(double* pvalue,double* gauss);
+		void GetParameterValue(double* pvalue,GaussTria* gauss);
 		void GetParameterValues(double* values,double* gauss_pointers, int numgauss);
 		void GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, double* gauss);
+		void GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss);
 		void GetParameterAverage(double* pvalue){ISSMERROR("not implemented yet");};
 		void GetVxStrainRate2d(double* epsilonvx,double* xyz_list, double* gauss){ISSMERROR("not implemented yet");};
Index: /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp	(revision 5628)
+++ /issm/trunk/src/c/objects/Inputs/PentaVertexInput.cpp	(revision 5629)
@@ -176,6 +176,14 @@
 
 /*Object functions*/
-/*FUNCTION PentaVertexInput::GetParameterValue{{{1*/
+/*FUNCTION PentaVertexInput::GetParameterValue(double* pvalue,double* gauss){{{1*/
 void PentaVertexInput::GetParameterValue(double* pvalue,double* gauss){
+
+	/*Call PentaRef function*/
+	PentaRef::GetParameterValue(pvalue,&values[0],gauss);
+
+}
+/*}}}*/
+/*FUNCTION PentaVertexInput::GetParameterValue(double* pvalue,GaussTria* gauss){{{1*/
+void PentaVertexInput::GetParameterValue(double* pvalue,GaussTria* gauss){
 
 	/*Call PentaRef function*/
@@ -201,6 +209,13 @@
 }
 /*}}}*/
-/*FUNCTION PentaVertexInput::GetParameterDerivativeValue{{{1*/
+/*FUNCTION PentaVertexInput::GetParameterDerivativeValue(double* p, double* xyz_list, double* gauss){{{1*/
 void PentaVertexInput::GetParameterDerivativeValue(double* p, double* xyz_list, double* gauss){
+
+	/*Call PentaRef function*/
+	PentaRef::GetParameterDerivativeValue(p,&values[0],xyz_list,gauss);
+}
+/*}}}*/
+/*FUNCTION PentaVertexInput::GetParameterDerivativeValue(double* p, double* xyz_list, GaussTria* gauss){{{1*/
+void PentaVertexInput::GetParameterDerivativeValue(double* p, double* xyz_list, GaussTria* gauss){
 
 	/*Call PentaRef function*/
Index: /issm/trunk/src/c/objects/Inputs/PentaVertexInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/PentaVertexInput.h	(revision 5628)
+++ /issm/trunk/src/c/objects/Inputs/PentaVertexInput.h	(revision 5629)
@@ -11,4 +11,5 @@
 #include "./Input.h"
 #include "../Elements/PentaRef.h"
+class GaussTria;
 /*}}}*/
 
@@ -47,6 +48,8 @@
 		void GetParameterValue(double* pvalue){ISSMERROR("not implemented yet");};
 		void GetParameterValue(double* pvalue,double* gauss);
+		void GetParameterValue(double* pvalue,GaussTria* gauss);
 		void GetParameterValues(double* values,double* gauss_pointers, int numgauss);
 		void GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, double* gauss);
+		void GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss);
 		void GetParameterAverage(double* pvalue);
 		void GetVxStrainRate2d(double* epsilonvx,double* xyz_list, double* gauss){ISSMERROR("not implemented yet");};
Index: /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp
===================================================================
--- /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp	(revision 5628)
+++ /issm/trunk/src/c/objects/Inputs/TriaVertexInput.cpp	(revision 5629)
@@ -165,6 +165,14 @@
 
 /*Object functions*/
-/*FUNCTION TriaVertexInput::GetParameterValue{{{1*/
+/*FUNCTION TriaVertexInput::GetParameterValue(double* pvalue,double* gauss){{{1*/
 void TriaVertexInput::GetParameterValue(double* pvalue,double* gauss){
+
+	/*Call TriaRef function*/
+	TriaRef::GetParameterValue(pvalue,&values[0],gauss);
+
+}
+/*}}}*/
+/*FUNCTION TriaVertexInput::GetParameterValue(double* pvalue,GaussTria* gauss){{{1*/
+void TriaVertexInput::GetParameterValue(double* pvalue,GaussTria* gauss){
 
 	/*Call TriaRef function*/
@@ -191,6 +199,13 @@
 }
 /*}}}*/
-/*FUNCTION TriaVertexInput::GetParameterDerivativeValue{{{1*/
+/*FUNCTION TriaVertexInput::GetParameterDerivativeValue(double* p, double* xyz_list, double* gauss){{{1*/
 void TriaVertexInput::GetParameterDerivativeValue(double* p, double* xyz_list, double* gauss){
+
+	/*Call TriaRef function*/
+	TriaRef::GetParameterDerivativeValue(p,&values[0],xyz_list,gauss);
+}
+/*}}}*/
+/*FUNCTION TriaVertexInput::GetParameterDerivativeValue(double* p, double* xyz_list, GaussTria* gauss){{{1*/
+void TriaVertexInput::GetParameterDerivativeValue(double* p, double* xyz_list, GaussTria* gauss){
 
 	/*Call TriaRef function*/
Index: /issm/trunk/src/c/objects/Inputs/TriaVertexInput.h
===================================================================
--- /issm/trunk/src/c/objects/Inputs/TriaVertexInput.h	(revision 5628)
+++ /issm/trunk/src/c/objects/Inputs/TriaVertexInput.h	(revision 5629)
@@ -11,4 +11,5 @@
 #include "./Input.h"
 #include "../Elements/TriaRef.h"
+class GaussTria;
 /*}}}*/
 
@@ -47,6 +48,8 @@
 		void GetParameterValue(double* pvalue){ISSMERROR("not implemented yet");}
 		void GetParameterValue(double* pvalue,double* gauss);
+		void GetParameterValue(double* pvalue,GaussTria* gauss);
 		void GetParameterValues(double* values,double* gauss_pointers, int numgauss);
 		void GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, double* gauss);
+		void GetParameterDerivativeValue(double* derivativevalues, double* xyz_list, GaussTria* gauss);
 		void GetParameterAverage(double* pvalue);
 		void GetVxStrainRate2d(double* epsilonvx,double* xyz_list, double* gauss);
