Index: /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 26154)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 26155)
@@ -188,7 +188,17 @@
 		}
 		else{
-			IoModelToConstraintsx(constraints,iomodel,"md.stressbalance.spcvx",StressbalanceAnalysisEnum,finiteelement,0);
-			if(iomodel->domaintype!=Domain2DverticalEnum){
-				IoModelToConstraintsx(constraints,iomodel,"md.stressbalance.spcvy",StressbalanceAnalysisEnum,finiteelement,1);
+			if(!isMLHO){
+				IoModelToConstraintsx(constraints,iomodel,"md.stressbalance.spcvx",StressbalanceAnalysisEnum,finiteelement,0);
+				if(iomodel->domaintype!=Domain2DverticalEnum){
+					IoModelToConstraintsx(constraints,iomodel,"md.stressbalance.spcvy",StressbalanceAnalysisEnum,finiteelement,1);
+				}
+			}
+			else{//itapopo testing here
+				IoModelToConstraintsx(constraints,iomodel,"md.stressbalance.spcvx",StressbalanceAnalysisEnum,finiteelement,0);
+				IoModelToConstraintsx(constraints,iomodel,"md.stressbalance.spcvx",StressbalanceAnalysisEnum,finiteelement,1);
+				if(iomodel->domaintype!=Domain2DverticalEnum){
+					IoModelToConstraintsx(constraints,iomodel,"md.stressbalance.spcvy",StressbalanceAnalysisEnum,finiteelement,2);
+					IoModelToConstraintsx(constraints,iomodel,"md.stressbalance.spcvy",StressbalanceAnalysisEnum,finiteelement,3);
+				}
 			}
 		}
@@ -773,4 +783,8 @@
 	iomodel->FetchDataToInput(inputs,elements,"md.initialization.vx",VxEnum,0.);
 	iomodel->FetchDataToInput(inputs,elements,"md.initialization.vy",VyEnum,0.);
+	if(isMLHO){//itapopo
+		iomodel->FetchDataToInput(inputs,elements,"md.initialization.vx",VxBaseEnum,0.);
+		iomodel->FetchDataToInput(inputs,elements,"md.initialization.vy",VyBaseEnum,0.);
+	}
 	iomodel->FetchDataToInput(inputs,elements,"md.stressbalance.loadingforcex",LoadingforceXEnum);
 	iomodel->FetchDataToInput(inputs,elements,"md.stressbalance.loadingforcey",LoadingforceYEnum);
@@ -1211,6 +1225,9 @@
 			GetSolutionFromInputsFS(solution,element);
 			return;
-		case SSAApproximationEnum: case HOApproximationEnum: case L1L2ApproximationEnum: case MLHOApproximationEnum: case SIAApproximationEnum:
+		case SSAApproximationEnum: case HOApproximationEnum: case L1L2ApproximationEnum: case SIAApproximationEnum:
 			GetSolutionFromInputsHoriz(solution,element);
+			return;
+		case MLHOApproximationEnum:
+			GetSolutionFromInputsMLHO(solution,element);
 			return;
 		case SSAHOApproximationEnum: case HOFSApproximationEnum: case SSAFSApproximationEnum:
@@ -2707,8 +2724,7 @@
 /*MLHO*/
 ElementMatrix* StressbalanceAnalysis::CreateKMatrixMLHO(Element* element){/*{{{*/
-_error_("not implemented yet");
+
 	/* Check if ice in element */
 	if(!element->IsIceInElement()) return NULL;
-
 	/*compute all stiffness matrices for this element*/
 	ElementMatrix* Ke1=CreateKMatrixMLHOViscous(element);
@@ -2724,5 +2740,23 @@
 
 	if(!element->IsOnBase() || element->IsFloating()) return NULL;
-	Element* basalelement = element->SpawnBasalElement();
+	
+	/*Intermediaries*/
+	int      domaintype;
+   Element* basalelement;
+
+   /*Get basal element*/
+   element->FindParam(&domaintype,DomainTypeEnum);
+   switch(domaintype){
+      case Domain2DhorizontalEnum:
+         basalelement = element;
+         break;
+      case Domain3DEnum: case Domain2DverticalEnum:
+          _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+			//basalelement = element->SpawnBasalElement();
+         break;
+      default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+   }
+
+	//Element* basalelement = element->SpawnBasalElement();
 	ElementMatrix* Ke    = basalelement->NewElementMatrix(MLHOApproximationEnum);
 	ElementMatrix* KeSSA = CreateKMatrixSSAFriction(basalelement); //only to get K11 and K33
@@ -2733,8 +2767,11 @@
 	for(int i=0;i<numnodes;i++){
       for(int j=0;j<numnodes;j++){
-         Ke->values[(i+0*numnodes)*2*2*numnodes+j+0*numnodes] = KeSSA->values[2*i*2*numnodes+2*j]; //K11
-         Ke->values[(i+2*numnodes)*2*2*numnodes+j+2*numnodes] = KeSSA->values[(2*i+1)*2*numnodes+2*j+1]; //K33
+         Ke->values[(4*i+0)*2*2*numnodes+4*j+0] = KeSSA->values[2*i*2*numnodes+2*j]; //K11
+         Ke->values[(4*i+2)*2*2*numnodes+4*j+2] = KeSSA->values[(2*i+1)*2*numnodes+2*j+1]; //K33
       }  
    }
+	
+	/*Transform Coordinate System*/
+	//basalelement->TransformStiffnessMatrixCoord(Ke,XYMLHOEnum);
 
 	/*clean-up and return*/
@@ -2748,7 +2785,22 @@
 	IssmDouble  viscosity,Jdet,thickness,n;
 	IssmDouble *xyz_list = NULL;
+	int      domaintype;
+	Element* basalelement;
+
+	/*Get basal element*/
+	element->FindParam(&domaintype,DomainTypeEnum);
+	switch(domaintype){
+		case Domain2DhorizontalEnum:
+			basalelement = element;
+			break;
+		case Domain3DEnum: case Domain2DverticalEnum:
+			_error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+			//basalelement = element->GetBasalElement()->SpawnBasalElement(true);
+			break;
+		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+	}
 
 	/*Get element on base*/
-	Element* basalelement = element->GetBasalElement()->SpawnBasalElement(true);
+	//Element* basalelement = element->GetBasalElement()->SpawnBasalElement(true);
 
 	/*Fetch number of nodes and dof for this finite element*/
@@ -2781,24 +2833,25 @@
 		n_input->GetInputValue(&n,gauss);
 		element->material->ViscosityL1L2(&viscosity,xyz_list,gauss,vx_input,vy_input,surface_input);
-		
+		//viscosity=10e10;//itapopo
+
 		for(int i=0;i<numnodes;i++){//shape functions on tria element
 			for(int j=0;j<numnodes;j++){
-				Ke->values[(i+0*numnodes)*2*2*numnodes+j+0*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+0)*2*2*numnodes+4*j+0] += gauss->weight*Jdet*viscosity*thickness*(
 							4.*dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]
 							);//K11
-				Ke->values[(i+0*numnodes)*2*2*numnodes+j+1*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+0)*2*2*numnodes+4*j+1] += gauss->weight*Jdet*viscosity*thickness*(
 							4.*dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]
 							)*(n+1)/(n+2);//K12
-				Ke->values[(i+0*numnodes)*2*2*numnodes+j+2*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+0)*2*2*numnodes+4*j+2] += gauss->weight*Jdet*viscosity*thickness*(
 							2.*dbasis[1*numnodes+j]*dbasis[0*numnodes+i] + dbasis[0*numnodes+j]*dbasis[1*numnodes+i]
 							);//K13
-				Ke->values[(i+0*numnodes)*2*2*numnodes+j+3*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[ (4*i+0)*2*2*numnodes+4*j+3] += gauss->weight*Jdet*viscosity*thickness*(
                      2.*dbasis[1*numnodes+j]*dbasis[0*numnodes+i] + dbasis[0*numnodes+j]*dbasis[1*numnodes+i]
                      )*(n+1)/(n+2);//K14
 				
-				Ke->values[(i+1*numnodes)*2*2*numnodes+j+0*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+1)*2*2*numnodes+4*j+0] += gauss->weight*Jdet*viscosity*thickness*(
 							4.*dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]
 							)*(n+1)/(n+2);//K21
-				Ke->values[(i+1*numnodes)*2*2*numnodes+j+1*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+1)*2*2*numnodes+4*j+1] += gauss->weight*Jdet*viscosity*thickness*(
 							4.*dbasis[0*numnodes+j]*dbasis[0*numnodes+i] + dbasis[1*numnodes+j]*dbasis[1*numnodes+i]
 							)*2*pow(n+1,2)/((2*n+3)*(n+2)) 
@@ -2806,34 +2859,34 @@
 							gauss->weight*Jdet*viscosity*basis[j]*basis[i]*pow(n+1,2)/(thickness*(2*n+1))
 							;//K22
-				Ke->values[(i+1*numnodes)*2*2*numnodes+j+2*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+1)*2*2*numnodes+4*j+2] += gauss->weight*Jdet*viscosity*thickness*(
 							2.*dbasis[1*numnodes+j]*dbasis[0*numnodes+i] + dbasis[0*numnodes+j]*dbasis[1*numnodes+i]
 							)*(n+1)/(n+2);//K23
-				Ke->values[(i+1*numnodes)*2*2*numnodes+j+3*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+1)*2*2*numnodes+4*j+3] += gauss->weight*Jdet*viscosity*thickness*(
 							2.*dbasis[1*numnodes+j]*dbasis[0*numnodes+i] + dbasis[0*numnodes+j]*dbasis[1*numnodes+i]
 							)*2*pow(n+1,2)/((2*n+3)*(n+2));//K24
 				
-				Ke->values[(i+2*numnodes)*2*2*numnodes+j+0*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+2)*2*2*numnodes+4*j+0] += gauss->weight*Jdet*viscosity*thickness*(
 							2.*dbasis[0*numnodes+j]*dbasis[1*numnodes+i] + dbasis[1*numnodes+j]*dbasis[0*numnodes+i]
 							);//K31
-				Ke->values[(i+2*numnodes)*2*2*numnodes+j+1*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+2)*2*2*numnodes+4*j+1] += gauss->weight*Jdet*viscosity*thickness*(
 							2.*dbasis[0*numnodes+j]*dbasis[1*numnodes+i] + dbasis[1*numnodes+j]*dbasis[0*numnodes+i]
 							)*(n+1)/(n+2);//K32
-				Ke->values[(i+2*numnodes)*2*2*numnodes+j+2*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+2)*2*2*numnodes+4*j+2] += gauss->weight*Jdet*viscosity*thickness*(
 							4.*dbasis[1*numnodes+j]*dbasis[1*numnodes+i] + dbasis[0*numnodes+j]*dbasis[0*numnodes+i]
 							);//K33
-				Ke->values[(i+2*numnodes)*2*2*numnodes+j+3*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+2)*2*2*numnodes+4*j+3] += gauss->weight*Jdet*viscosity*thickness*(
 							4.*dbasis[1*numnodes+j]*dbasis[1*numnodes+i] + dbasis[0*numnodes+j]*dbasis[0*numnodes+i]
 							)*(n+1)/(n+2);//K34
 
-				Ke->values[(i+3*numnodes)*2*2*numnodes+j+0*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+3)*2*2*numnodes+4*j+0] += gauss->weight*Jdet*viscosity*thickness*(
                      2.*dbasis[0*numnodes+j]*dbasis[1*numnodes+i] + dbasis[1*numnodes+j]*dbasis[0*numnodes+i]
                      )*(n+1)/(n+2);//K41
-				Ke->values[(i+3*numnodes)*2*2*numnodes+j+1*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+3)*2*2*numnodes+4*j+1] += gauss->weight*Jdet*viscosity*thickness*(
                      2.*dbasis[0*numnodes+j]*dbasis[1*numnodes+i] + dbasis[1*numnodes+j]*dbasis[0*numnodes+i]
                      )*2*pow(n+1,2)/((2*n+3)*(n+2));//K42
-				Ke->values[(i+3*numnodes)*2*2*numnodes+j+2*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+3)*2*2*numnodes+4*j+2] += gauss->weight*Jdet*viscosity*thickness*(
 							4.*dbasis[1*numnodes+j]*dbasis[1*numnodes+i] + dbasis[0*numnodes+j]*dbasis[0*numnodes+i]
 							)*(n+1)/(n+2);//K43
-				Ke->values[(i+3*numnodes)*2*2*numnodes+j+3*numnodes] += gauss->weight*Jdet*viscosity*thickness*(
+				Ke->values[(4*i+3)*2*2*numnodes+4*j+3] += gauss->weight*Jdet*viscosity*thickness*(
 							4.*dbasis[1*numnodes+j]*dbasis[1*numnodes+i] + dbasis[0*numnodes+j]*dbasis[0*numnodes+i]
 							)*2*pow(n+1,2)/((2*n+3)*(n+2))
@@ -2844,7 +2897,7 @@
 		}
 	}
-
+ 
 	/*Transform Coordinate System*/
-	basalelement->TransformStiffnessMatrixCoord(Ke,XYEnum);
+	//basalelement->TransformStiffnessMatrixCoord(Ke,XYMLHOEnum);
 
 	/*Clean up and return*/
@@ -2878,5 +2931,5 @@
 		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
 	}
-
+	
 	/*compute all load vectors for this element*/
 	ElementVector* pe1=CreatePVectorMLHODrivingStress(basalelement);
@@ -2920,14 +2973,14 @@
 		n_input->GetInputValue(&n,gauss);
 
-		for(int i=0;i<numnodes;i++){
-			pe->values[i+0*numnodes]+=-rhog*thickness*slope[0]*Jdet*gauss->weight*basis[i]; //F1
-			pe->values[i+1*numnodes]+=-rhog*thickness*slope[0]*Jdet*gauss->weight*basis[i]*(n+1)/(n+2); //F2
-			pe->values[i+2*numnodes]+=-rhog*thickness*slope[1]*Jdet*gauss->weight*basis[i]; //F3
-			pe->values[i+3*numnodes]+=-rhog*thickness*slope[1]*Jdet*gauss->weight*basis[i]*(n+1)/(n+2); //F4
+		for(int i=0;i<numnodes;i++){// per node: vx (basal vx), vshx, vy (basal vy), vshy
+			pe->values[i*4+0]+=-rhog*thickness*slope[0]*Jdet*gauss->weight*basis[i]; //F1
+			pe->values[i*4+1]+=-rhog*thickness*slope[0]*Jdet*gauss->weight*basis[i]*(n+1)/(n+2); //F2
+			pe->values[i*4+2]+=-rhog*thickness*slope[1]*Jdet*gauss->weight*basis[i]; //F3
+			pe->values[i*4+3]+=-rhog*thickness*slope[1]*Jdet*gauss->weight*basis[i]*(n+1)/(n+2); //F4
 		}
 	}
 
 	/*Transform coordinate system*/
-	element->TransformLoadVectorCoord(pe,XYEnum);
+	//element->TransformLoadVectorCoord(pe,XYMLHOEnum);
 
 	/*Clean up and return*/
@@ -2993,13 +3046,13 @@
 
 		for (int i=0;i<numnodes;i++){
-			pe->values[i+0*numnodes]+= pressure*Jdet*gauss->weight*normal[0]*basis[i]; // F1
-			pe->values[i+1*numnodes]+= pressure_sh*Jdet*gauss->weight*normal[0]*basis[i]; // F2
-			pe->values[i+2*numnodes]+= pressure*Jdet*gauss->weight*normal[1]*basis[i]; // F3
-			pe->values[i+3*numnodes]+= pressure_sh*Jdet*gauss->weight*normal[1]*basis[i]; // F4
+			pe->values[i*4+0]+= pressure*Jdet*gauss->weight*normal[0]*basis[i]; // F1
+			pe->values[i*4+1]+= pressure_sh*Jdet*gauss->weight*normal[0]*basis[i]; // F2
+			pe->values[i*4+2]+= pressure*Jdet*gauss->weight*normal[1]*basis[i]; // F3
+			pe->values[i*4+3]+= pressure_sh*Jdet*gauss->weight*normal[1]*basis[i]; // F4
 		}
 	}
 
 	/*Transform coordinate system*/
-	element->TransformLoadVectorCoord(pe,XYEnum);
+	//element->TransformLoadVectorCoord(pe,XYMLHOEnum);
 
 	/*Clean up and return*/
@@ -3060,5 +3113,5 @@
 
 	/*Fetch dof list and allocate solution vectors*/
-	basalelement->GetDofListLocal(&doflist,MLHOApproximationEnum,GsetEnum); //itapopo check this
+	basalelement->GetDofListLocal(&doflist,MLHOApproximationEnum,GsetEnum); 
 	//basalelement->GetDofListLocal(&doflist,NoneApproximationEnum,GsetEnum);
 	IssmDouble* values    = xNew<IssmDouble>(numdof);
@@ -3073,4 +3126,9 @@
 	for(i=0;i<numdof;i++) values[i]=solution[doflist[i]];
 
+	std::cout<<"********  Element ID="<<element->Id()<<"\n";
+	for(i=0;i<numdof;i++){
+		std::cout<<values[i]<<"\n";
+	}
+
 	/*Transform solution in Cartesian Space*/
 	basalelement->TransformSolutionCoord(&values[0],XYEnum);
@@ -3079,6 +3137,6 @@
    /*Ok, we have vx and vy in values, fill in vx and vy arrays: */
    for(i=0;i<numnodes;i++){ //numnodes of the 2D mesh in which the MLHO is written
-      vx[i]  =values[i+0*numnodes]; //basal vx
-      vshx[i]=values[i+1*numnodes];
+      vx[i]  =values[i*4+0]; //basal vx
+      vshx[i]=values[i*4+1];
 		if(xIsNan<IssmDouble>(vx[i]))		_error_("NaN found in solution vector");
       if(xIsInf<IssmDouble>(vx[i]))		_error_("Inf found in solution vector");
@@ -3086,6 +3144,6 @@
       if(xIsInf<IssmDouble>(vshx[i]))	_error_("Inf found in solution vector");
       //if(dim==3){
-         vy[i] =values[i+2*numnodes];
-         vshy[i]=values[i+3*numnodes];
+         vy[i] =values[i*4+2]; //basal vy
+         vshy[i]=values[i*4+3];
          if(xIsNan<IssmDouble>(vy[i]))		_error_("NaN found in solution vector");
          if(xIsInf<IssmDouble>(vy[i]))		_error_("Inf found in solution vector");
@@ -3095,4 +3153,8 @@
    }
 
+	/*Add vx and vy as inputs to the tria element (basal velocities): */
+	element->AddBasalInput(VxBaseEnum,vx,element->GetElementType());
+	element->AddBasalInput(VyBaseEnum,vy,element->GetElementType());
+
 	/*Compute suface velocities vx and vy*/
 	if(domaintype==Domain2DhorizontalEnum) {
@@ -3101,9 +3163,9 @@
 	}
 
-	/*Get Vz and compute vel*/
+	/*Get Vz and compute vel (surface)*/
 	basalelement->GetInputListOnNodes(&vz[0],VzEnum,0.);
 	for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]); 
 
-	/*Add vx and vy as inputs to the tria element: */
+	/*Add vx and vy as inputs to the tria element surface velocities): */
 	element->AddBasalInput(VxEnum,vx,element->GetElementType());
 	element->AddBasalInput(VyEnum,vy,element->GetElementType());
@@ -3121,4 +3183,63 @@
 	xDelete<int>(doflist);
 	if(basalelement->IsSpawnedElement()){basalelement->DeleteMaterials(); delete basalelement;};
+}/*}}}*/
+void           StressbalanceAnalysis::GetSolutionFromInputsMLHO(Vector<IssmDouble>* solution,Element* element){/*{{{*/
+
+	IssmDouble   vx,vy,vbx,vby;
+	int          domaintype,dim,approximation,dofpernode;
+	int*         doflist = NULL;
+
+	/*Get some parameters*/
+	element->FindParam(&domaintype,DomainTypeEnum);
+	switch(domaintype){
+		case Domain2DhorizontalEnum: dim = 2; dofpernode = 4; break;
+		case Domain2DverticalEnum: case Domain3DEnum: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet"); break;
+		default: _error_("mesh "<<EnumToStringx(domaintype)<<" not supported yet");
+	}
+
+	/*Fetch number of nodes and dof for this finite element*/
+	int numnodes = element->GetNumberOfNodes();
+	int numdof   = numnodes*dofpernode;
+	element->GetInputValue(&approximation,ApproximationEnum);
+	if(approximation!=MLHOApproximationEnum) _error_("mesh "<<EnumToStringx(approximation)<<" not supported here");
+
+	/*Fetch dof list and allocate solution vector*/
+	element->GetDofList(&doflist,approximation,GsetEnum); 
+	IssmDouble* values = xNew<IssmDouble>(numdof);
+
+	/*Get inputs*/
+	Input* vx_input		=element->GetInput(VxEnum);		_assert_(vx_input);
+	Input* vxbase_input	=element->GetInput(VxBaseEnum);	_assert_(vxbase_input);
+	Input* vy_input		=NULL;
+	Input* vybase_input	=NULL;
+	if(domaintype!=Domain2DverticalEnum){
+		vy_input		=element->GetInput(VyEnum);		_assert_(vy_input);
+		vybase_input=element->GetInput(VyBaseEnum);	_assert_(vybase_input);
+	}
+
+	/*Ok, we have vx and vy in values, fill in vx and vy arrays: */
+	Gauss* gauss=element->NewGauss();
+	for(int i=0;i<numnodes;i++){
+		gauss->GaussNode(element->FiniteElement(),i);
+
+		/*Recover vx and vy*/
+		vx_input->GetInputValue(&vx,gauss);
+		vxbase_input->GetInputValue(&vbx,gauss);
+		values[i*4+0]=vbx; //basal vx
+		values[i*4+1]=vx-vbx; //shear vx
+		//if(dofpernode==2){
+			vy_input->GetInputValue(&vy,gauss);
+			vybase_input->GetInputValue(&vby,gauss);
+			values[i*4+2]=vby; //basal vy
+			values[i*4+3]=vy-vby; //shear vy  
+		//}
+	}
+
+	solution->SetValues(numdof,doflist,values,INS_VAL);
+	
+	/*Free ressources:*/
+	delete gauss;
+	xDelete<IssmDouble>(values);
+	xDelete<int>(doflist);
 }/*}}}*/
 
Index: /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h	(revision 26154)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h	(revision 26155)
@@ -65,4 +65,5 @@
 		ElementVector* CreatePVectorMLHODrivingStress(Element* element);
 		void           InputUpdateFromSolutionMLHO(IssmDouble* solution,Element* element);
+		void           GetSolutionFromInputsMLHO(Vector<IssmDouble>* solution,Element* element);
 		/*HO*/
 		ElementMatrix* CreateJacobianMatrixHO(Element* element);
Index: /issm/trunk-jpl/src/c/classes/gauss/GaussTria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/gauss/GaussTria.cpp	(revision 26154)
+++ /issm/trunk-jpl/src/c/classes/gauss/GaussTria.cpp	(revision 26155)
@@ -636,6 +636,13 @@
 } /*}}}*/
 void GaussTria::SynchronizeGaussBase(Gauss* gauss){/*{{{*/
-
-	_error_("not supported");
-}
-/*}}}*/
+	//itapopo check this
+	_assert_(gauss->Enum()==GaussTriaEnum);
+   GaussTria* gauss_tria = xDynamicCast<GaussTria*>(gauss);
+
+   gauss_tria->coord1=this->coord1;
+   gauss_tria->coord2=this->coord2;
+   gauss_tria->coord3=this->coord3;
+   gauss_tria->weight=UNDEF;
+	//_error_("not supported");
+}
+/*}}}*/
Index: /issm/trunk-jpl/src/c/cores/stressbalance_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/stressbalance_core.cpp	(revision 26154)
+++ /issm/trunk-jpl/src/c/cores/stressbalance_core.cpp	(revision 26155)
@@ -19,5 +19,5 @@
 	bool       dakota_analysis,control_analysis;
 	int        domaintype;
-	bool       isSIA,isSSA,isL1L2,isHO,isFS,isNitsche;
+	bool       isSIA,isSSA,isL1L2,isMLHO,isHO,isFS,isNitsche;
 	bool       save_results;
 	int        solution_type;
@@ -31,4 +31,5 @@
 	femmodel->parameters->FindParam(&isSSA,FlowequationIsSSAEnum);
 	femmodel->parameters->FindParam(&isL1L2,FlowequationIsL1L2Enum);
+	femmodel->parameters->FindParam(&isMLHO,FlowequationIsMLHOEnum);
 	femmodel->parameters->FindParam(&isHO,FlowequationIsHOEnum);
 	femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum);
@@ -74,5 +75,5 @@
 
 	/*Compute stressbalance for SSA L1L2 HO and FS*/
-	if(isSSA || isL1L2 || isHO || isFS){
+	if(isSSA || isL1L2 || isMLHO || isHO || isFS){
 		analysis = new StressbalanceAnalysis();
 		analysis->Core(femmodel);
@@ -81,5 +82,5 @@
 
 	/*Compute vertical velocities*/
-	if (domaintype==Domain3DEnum && (isSIA || isSSA || isL1L2 || isHO)){
+	if (domaintype==Domain3DEnum && (isSIA || isSSA || isL1L2 || isMLHO || isHO)){
 
 		/*We need basal melt rates for vertical velocity*/
Index: /issm/trunk-jpl/src/c/shared/Enum/Enum.vim
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 26154)
+++ /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 26155)
@@ -936,8 +936,10 @@
 syn keyword cConstant VelEnum
 syn keyword cConstant VxAverageEnum
+syn keyword cConstant VxBaseEnum
 syn keyword cConstant VxEnum
 syn keyword cConstant VxMeshEnum
 syn keyword cConstant VxObsEnum
 syn keyword cConstant VyAverageEnum
+syn keyword cConstant VyBaseEnum
 syn keyword cConstant VyEnum
 syn keyword cConstant VyMeshEnum
@@ -1450,4 +1452,5 @@
 syn keyword cType Cfsurfacesquare
 syn keyword cType Channel
+syn keyword cType classes
 syn keyword cType Constraint
 syn keyword cType Constraints
@@ -1456,6 +1459,6 @@
 syn keyword cType ControlInput
 syn keyword cType Covertree
+syn keyword cType DatasetInput
 syn keyword cType DataSetParam
-syn keyword cType DatasetInput
 syn keyword cType Definition
 syn keyword cType DependentObject
@@ -1470,6 +1473,6 @@
 syn keyword cType ElementInput
 syn keyword cType ElementMatrix
+syn keyword cType Elements
 syn keyword cType ElementVector
-syn keyword cType Elements
 syn keyword cType ExponentialVariogram
 syn keyword cType ExternalResult
@@ -1478,9 +1481,10 @@
 syn keyword cType Friction
 syn keyword cType Gauss
+syn keyword cType GaussianVariogram
+syn keyword cType gaussobjects
 syn keyword cType GaussPenta
 syn keyword cType GaussSeg
 syn keyword cType GaussTetra
 syn keyword cType GaussTria
-syn keyword cType GaussianVariogram
 syn keyword cType GenericExternalResult
 syn keyword cType GenericOption
@@ -1497,4 +1501,5 @@
 syn keyword cType IssmDirectApplicInterface
 syn keyword cType IssmParallelDirectApplicInterface
+syn keyword cType krigingobjects
 syn keyword cType Load
 syn keyword cType Loads
@@ -1507,4 +1512,5 @@
 syn keyword cType Matice
 syn keyword cType Matlitho
+syn keyword cType matrixobjects
 syn keyword cType MatrixParam
 syn keyword cType Misfit
@@ -1519,6 +1525,6 @@
 syn keyword cType Observations
 syn keyword cType Option
+syn keyword cType Options
 syn keyword cType OptionUtilities
-syn keyword cType Options
 syn keyword cType Param
 syn keyword cType Parameters
@@ -1534,11 +1540,11 @@
 syn keyword cType Regionaloutput
 syn keyword cType Results
+syn keyword cType Riftfront
 syn keyword cType RiftStruct
-syn keyword cType Riftfront
 syn keyword cType SealevelMasks
 syn keyword cType Seg
 syn keyword cType SegInput
+syn keyword cType Segment
 syn keyword cType SegRef
-syn keyword cType Segment
 syn keyword cType SpcDynamic
 syn keyword cType SpcStatic
@@ -1559,8 +1565,4 @@
 syn keyword cType Vertex
 syn keyword cType Vertices
-syn keyword cType classes
-syn keyword cType gaussobjects
-syn keyword cType krigingobjects
-syn keyword cType matrixobjects
 syn keyword cType AdjointBalancethickness2Analysis
 syn keyword cType AdjointBalancethicknessAnalysis
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 26154)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 26155)
@@ -933,8 +933,10 @@
 	VelEnum,
 	VxAverageEnum,
+	VxBaseEnum,
 	VxEnum,
 	VxMeshEnum,
 	VxObsEnum,
 	VyAverageEnum,
+	VyBaseEnum,
 	VyEnum,
 	VyMeshEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 26154)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 26155)
@@ -938,8 +938,10 @@
 		case VelEnum : return "Vel";
 		case VxAverageEnum : return "VxAverage";
+		case VxBaseEnum : return "VxBase";
 		case VxEnum : return "Vx";
 		case VxMeshEnum : return "VxMesh";
 		case VxObsEnum : return "VxObs";
 		case VyAverageEnum : return "VyAverage";
+		case VyBaseEnum : return "VyBase";
 		case VyEnum : return "Vy";
 		case VyMeshEnum : return "VyMesh";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 26154)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 26155)
@@ -959,8 +959,10 @@
 	      else if (strcmp(name,"Vel")==0) return VelEnum;
 	      else if (strcmp(name,"VxAverage")==0) return VxAverageEnum;
+	      else if (strcmp(name,"VxBase")==0) return VxBaseEnum;
 	      else if (strcmp(name,"Vx")==0) return VxEnum;
 	      else if (strcmp(name,"VxMesh")==0) return VxMeshEnum;
 	      else if (strcmp(name,"VxObs")==0) return VxObsEnum;
 	      else if (strcmp(name,"VyAverage")==0) return VyAverageEnum;
+	      else if (strcmp(name,"VyBase")==0) return VyBaseEnum;
 	      else if (strcmp(name,"Vy")==0) return VyEnum;
 	      else if (strcmp(name,"VyMesh")==0) return VyMeshEnum;
@@ -996,10 +998,10 @@
 	      else if (strcmp(name,"Outputdefinition22")==0) return Outputdefinition22Enum;
 	      else if (strcmp(name,"Outputdefinition23")==0) return Outputdefinition23Enum;
-	      else if (strcmp(name,"Outputdefinition24")==0) return Outputdefinition24Enum;
-	      else if (strcmp(name,"Outputdefinition25")==0) return Outputdefinition25Enum;
          else stage=9;
    }
    if(stage==9){
-	      if (strcmp(name,"Outputdefinition26")==0) return Outputdefinition26Enum;
+	      if (strcmp(name,"Outputdefinition24")==0) return Outputdefinition24Enum;
+	      else if (strcmp(name,"Outputdefinition25")==0) return Outputdefinition25Enum;
+	      else if (strcmp(name,"Outputdefinition26")==0) return Outputdefinition26Enum;
 	      else if (strcmp(name,"Outputdefinition27")==0) return Outputdefinition27Enum;
 	      else if (strcmp(name,"Outputdefinition28")==0) return Outputdefinition28Enum;
@@ -1119,10 +1121,10 @@
 	      else if (strcmp(name,"CalvingHab")==0) return CalvingHabEnum;
 	      else if (strcmp(name,"CalvingLevermann")==0) return CalvingLevermannEnum;
-	      else if (strcmp(name,"CalvingVonmises")==0) return CalvingVonmisesEnum;
-	      else if (strcmp(name,"Cfdragcoeffabsgrad")==0) return CfdragcoeffabsgradEnum;
          else stage=10;
    }
    if(stage==10){
-	      if (strcmp(name,"Cfsurfacelogvel")==0) return CfsurfacelogvelEnum;
+	      if (strcmp(name,"CalvingVonmises")==0) return CalvingVonmisesEnum;
+	      else if (strcmp(name,"Cfdragcoeffabsgrad")==0) return CfdragcoeffabsgradEnum;
+	      else if (strcmp(name,"Cfsurfacelogvel")==0) return CfsurfacelogvelEnum;
 	      else if (strcmp(name,"Cfsurfacesquare")==0) return CfsurfacesquareEnum;
 	      else if (strcmp(name,"Channel")==0) return ChannelEnum;
@@ -1242,10 +1244,10 @@
 	      else if (strcmp(name,"IntParam")==0) return IntParamEnum;
 	      else if (strcmp(name,"IntVecParam")==0) return IntVecParamEnum;
-	      else if (strcmp(name,"Inputs")==0) return InputsEnum;
-	      else if (strcmp(name,"Internal")==0) return InternalEnum;
          else stage=11;
    }
    if(stage==11){
-	      if (strcmp(name,"Intersect")==0) return IntersectEnum;
+	      if (strcmp(name,"Inputs")==0) return InputsEnum;
+	      else if (strcmp(name,"Internal")==0) return InternalEnum;
+	      else if (strcmp(name,"Intersect")==0) return IntersectEnum;
 	      else if (strcmp(name,"InversionVzObs")==0) return InversionVzObsEnum;
 	      else if (strcmp(name,"J")==0) return JEnum;
@@ -1365,10 +1367,10 @@
 	      else if (strcmp(name,"SMBd18opdd")==0) return SMBd18opddEnum;
 	      else if (strcmp(name,"SMBforcing")==0) return SMBforcingEnum;
-	      else if (strcmp(name,"SMBgcm")==0) return SMBgcmEnum;
-	      else if (strcmp(name,"SMBgemb")==0) return SMBgembEnum;
          else stage=12;
    }
    if(stage==12){
-	      if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum;
+	      if (strcmp(name,"SMBgcm")==0) return SMBgcmEnum;
+	      else if (strcmp(name,"SMBgemb")==0) return SMBgembEnum;
+	      else if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum;
 	      else if (strcmp(name,"SMBgradientscomponents")==0) return SMBgradientscomponentsEnum;
 	      else if (strcmp(name,"SMBgradientsela")==0) return SMBgradientselaEnum;
