Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 16441)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 16442)
@@ -397,5 +397,15 @@
 								./modules/ModelProcessorx/FreeSurfaceBase/CreateConstraintsFreeSurfaceBase.cpp\
 								./modules/ModelProcessorx/FreeSurfaceBase/CreateLoadsFreeSurfaceBase.cpp\
-								./analyses/masstransport_core.cpp
+								./modules/ModelProcessorx/ExtrudeFromBase/UpdateElementsExtrudeFromBase.cpp\
+								./modules/ModelProcessorx/ExtrudeFromBase/CreateNodesExtrudeFromBase.cpp \
+								./modules/ModelProcessorx/ExtrudeFromBase/CreateConstraintsExtrudeFromBase.cpp\
+								./modules/ModelProcessorx/ExtrudeFromBase/CreateLoadsExtrudeFromBase.cpp\
+								./modules/ModelProcessorx/ExtrudeFromTop/UpdateElementsExtrudeFromTop.cpp\
+								./modules/ModelProcessorx/ExtrudeFromTop/CreateNodesExtrudeFromTop.cpp \
+								./modules/ModelProcessorx/ExtrudeFromTop/CreateConstraintsExtrudeFromTop.cpp\
+								./modules/ModelProcessorx/ExtrudeFromTop/CreateLoadsExtrudeFromTop.cpp\
+								./analyses/masstransport_core.cpp\
+								./analyses/extrudefrombase_core.cpp\
+								./analyses/extrudefromtop_core.cpp
 
 #}}}
Index: /issm/trunk-jpl/src/c/analyses/AnalysisConfiguration.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/AnalysisConfiguration.cpp	(revision 16441)
+++ /issm/trunk-jpl/src/c/analyses/AnalysisConfiguration.cpp	(revision 16442)
@@ -121,5 +121,5 @@
 
 		case TransientSolutionEnum:
-			numanalyses=11;
+			numanalyses=13;
 			analyses=xNew<int>(numanalyses);
 			analyses[ 0]=StressbalanceAnalysisEnum;
@@ -134,4 +134,6 @@
 			analyses[ 9]=FreeSurfaceBaseAnalysisEnum;
 			analyses[10]=FreeSurfaceTopAnalysisEnum;
+			analyses[11]=ExtrudeFromBaseAnalysisEnum;
+			analyses[12]=ExtrudeFromTopAnalysisEnum;
 			break;
 
Index: /issm/trunk-jpl/src/c/analyses/analyses.h
===================================================================
--- /issm/trunk-jpl/src/c/analyses/analyses.h	(revision 16441)
+++ /issm/trunk-jpl/src/c/analyses/analyses.h	(revision 16442)
@@ -30,4 +30,6 @@
 void controltao_core(FemModel* femmodel);
 void masstransport_core(FemModel* femmodel);
+void extrudefrombase_core(FemModel* femmodel);
+void extrudefromtop_core(FemModel* femmodel);
 void balancethickness_core(FemModel* femmodel);
 void balancevelocity_core(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/analyses/masstransport_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/masstransport_core.cpp	(revision 16441)
+++ /issm/trunk-jpl/src/c/analyses/masstransport_core.cpp	(revision 16442)
@@ -13,10 +13,10 @@
 
 	/*parameters: */
-	int   i;
-	bool  save_results;
-	bool  issmbgradients,ispdd,isdelta18o,isFS,isfreesurface,dakota_analysis;
-	int   solution_type;
+	int    i;
+	int    numoutputs,meshtype;
+	bool   save_results;
+	bool   issmbgradients,ispdd,isdelta18o,isFS,isfreesurface,dakota_analysis;
+	int    solution_type;
 	char** requested_outputs = NULL;
-	int   numoutputs        = 0;
 
 	/*activate configuration*/
@@ -33,4 +33,5 @@
 	femmodel->parameters->FindParam(&solution_type,SolutionTypeEnum);
 	femmodel->parameters->FindParam(&numoutputs,MasstransportNumRequestedOutputsEnum);
+	femmodel->parameters->FindParam(&meshtype,MeshTypeEnum);
 	if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,MasstransportRequestedOutputsEnum);
 
@@ -59,6 +60,14 @@
 		femmodel->SetCurrentConfiguration(FreeSurfaceBaseAnalysisEnum);
 		solutionsequence_linear(femmodel);
+		if(meshtype==Mesh2DverticalEnum){
+			femmodel->parameters->SetParam(BedEnum,InputToExtrudeEnum);
+			extrudefrombase_core(femmodel);
+		}
 		femmodel->SetCurrentConfiguration(FreeSurfaceTopAnalysisEnum);
 		solutionsequence_linear(femmodel);
+		if(meshtype==Mesh2DverticalEnum){
+			femmodel->parameters->SetParam(SurfaceEnum,InputToExtrudeEnum);
+			extrudefromtop_core(femmodel);
+		}
 	}
 	else{
@@ -78,4 +87,4 @@
 
 	/*Free ressources:*/
-	if(numoutputs){ for (i=0;i<numoutputs;i++){char* string=requested_outputs[i];xDelete<char>(string);} xDelete<char*>(requested_outputs);} 
+	if(numoutputs){for(int i=0;i<numoutputs;i++){char* string=requested_outputs[i];xDelete<char>(string);} xDelete<char*>(requested_outputs);} 
 }
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 16441)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 16442)
@@ -127,8 +127,11 @@
 		#endif
 
+		virtual void UpdateConstraintsExtrudeFromBase(void)=0;
+		virtual void UpdateConstraintsExtrudeFromTop(void)=0;
+
 		#ifdef _HAVE_THERMAL_
 		virtual void UpdateBasalConstraintsEnthalpy(void)=0;
 		virtual void ComputeBasalMeltingrate(void)=0;
-       	virtual void DrainWaterfraction(void)=0;
+		virtual void DrainWaterfraction(void)=0;
 		#endif
 
Index: /issm/trunk-jpl/src/c/classes/Elements/Penta.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 16441)
+++ /issm/trunk-jpl/src/c/classes/Elements/Penta.h	(revision 16442)
@@ -330,4 +330,6 @@
 		#endif
 
+		void           UpdateConstraintsExtrudeFromBase(void){_error_("not implemented yet");};
+		void           UpdateConstraintsExtrudeFromTop(void){_error_("not implemented yet");};
 		#ifdef _HAVE_THERMAL_
 		ElementMatrix* CreateKMatrixEnthalpy(void);
Index: /issm/trunk-jpl/src/c/classes/Elements/Seg.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 16441)
+++ /issm/trunk-jpl/src/c/classes/Elements/Seg.h	(revision 16442)
@@ -124,4 +124,6 @@
 		void        Update(int index, IoModel* iomodel,int analysis_counter,int analysis_type,int finitelement){_error_("not implemented yet");};
 		IssmDouble  TimeAdapt(){_error_("not implemented yet");};
+		void UpdateConstraintsExtrudeFromBase(){_error_("not implemented");};
+		void UpdateConstraintsExtrudeFromTop(){_error_("not implemented");};
 
 #ifdef _HAVE_RESPONSES_
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 16441)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.cpp	(revision 16442)
@@ -281,4 +281,6 @@
 			}
 			break;
+		case ExtrudeFromBaseAnalysisEnum: case ExtrudeFromTopAnalysisEnum:
+			return CreateKMatrixExtrusion();
 		#endif
 		#ifdef _HAVE_HYDROLOGY_
@@ -493,4 +495,7 @@
 			}
 			break;
+		case ExtrudeFromBaseAnalysisEnum: case ExtrudeFromTopAnalysisEnum:
+			return NULL;
+			break;
 		#endif
 		#ifdef _HAVE_HYDROLOGY_
@@ -1789,5 +1794,5 @@
 
 	/*retrive parameters: */
-	int analysis_type;
+	int analysis_type,extrusioninput;
 	parameters->FindParam(&analysis_type,AnalysisTypeEnum);
 
@@ -1871,4 +1876,8 @@
 			InputUpdateFromSolutionOneDof(solution,BedEnum);
 			break;
+		case ExtrudeFromBaseAnalysisEnum: case ExtrudeFromTopAnalysisEnum:
+			this->parameters->FindParam(&extrusioninput,InputToExtrudeEnum);
+			InputUpdateFromSolutionOneDof(solution,extrusioninput);
+			break;
 		default:
 			_error_("analysis " << analysis_type << " (" << EnumToStringx(analysis_type) << ") not supported yet");
@@ -2901,4 +2910,48 @@
 	/*Fill with IoModel*/
 	this->InputUpdateFromIoModel(index,iomodel);
+}
+/*}}}*/
+/*FUNCTION Tria::UpdateConstraintsExtrudeFromBase{{{*/
+void  Tria::UpdateConstraintsExtrudeFromBase(void){
+
+	if(!HasEdgeOnBed()) return;
+
+	int extrusioninput;
+	int indices[2];
+	IssmDouble value;
+
+	this->parameters->FindParam(&extrusioninput,InputToExtrudeEnum);
+	Input* input = inputs->GetInput(extrusioninput); _assert_(extrusioninput);
+	this->EdgeOnBedIndices(&indices[0],&indices[1]);
+
+	GaussTria* gauss=new GaussTria();
+	for(int i=0;i<2;i++){
+		gauss->GaussNode(P1Enum,indices[i]);
+		input->GetInputValue(&value,gauss);
+		this->nodes[indices[i]]->ApplyConstraint(1,value);
+	}
+
+}
+/*}}}*/
+/*FUNCTION Tria::UpdateConstraintsExtrudeFromTop{{{*/
+void  Tria::UpdateConstraintsExtrudeFromTop(void){
+
+	if(!HasEdgeOnSurface()) return;
+
+	int extrusioninput;
+	int indices[2];
+	IssmDouble value;
+
+	this->parameters->FindParam(&extrusioninput,InputToExtrudeEnum);
+	Input* input = inputs->GetInput(extrusioninput); _assert_(extrusioninput);
+	this->EdgeOnSurfaceIndices(&indices[0],&indices[1]);
+
+	GaussTria* gauss=new GaussTria();
+	for(int i=0;i<2;i++){
+		gauss->GaussNode(P1Enum,indices[i]);
+		input->GetInputValue(&value,gauss);
+		this->nodes[indices[i]]->ApplyConstraint(1,value);
+	}
+
 }
 /*}}}*/
@@ -7256,4 +7309,161 @@
 
 #ifdef _HAVE_MASSTRANSPORT_
+/*FUNCTION Tria::CreateKMatrixExtrusion {{{*/
+ElementMatrix* Tria::CreateKMatrixExtrusion(void){
+
+	/*compute all stiffness matrices for this element*/
+	ElementMatrix* Ke1=CreateKMatrixExtrusionVolume();
+	ElementMatrix* Ke2=CreateKMatrixExtrusionSurface();
+	ElementMatrix* Ke3=CreateKMatrixExtrusionBed();
+	ElementMatrix* Ke =new ElementMatrix(Ke1,Ke2,Ke3);
+
+	/*clean-up and return*/
+	delete Ke1;
+	delete Ke2;
+	delete Ke3;
+	return Ke;
+
+}
+/*}}}*/
+/*FUNCTION Tria::CreateKMatrixExtrusionVolume {{{*/
+ElementMatrix* Tria::CreateKMatrixExtrusionVolume(void){
+
+	/*Intermediaries */
+	IssmDouble  Jdet;
+	IssmDouble  xyz_list[NUMVERTICES][3];
+	IssmDouble  B[NDOF1][NUMVERTICES];
+	IssmDouble  Bprime[NDOF1][NUMVERTICES];
+	IssmDouble  DL_scalar;
+	GaussTria  *gauss=NULL;
+
+	/*Initialize Element matrix*/
+	ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters,NoneApproximationEnum);
+
+	/*Retrieve all inputs and parameters*/
+	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+
+	/* Start  looping on the number of gaussian points: */
+	gauss=new GaussTria(2);
+	for(int ig=gauss->begin();ig<gauss->end();ig++){
+
+		gauss->GaussPoint(ig);
+
+		GetJacobianDeterminant(&Jdet, &xyz_list[0][0],gauss);
+		GetBExtrusion(&B[0][0], &xyz_list[0][0], gauss);
+		GetNodalFunctions(&Bprime[0][0],gauss);
+
+		DL_scalar=gauss->weight*Jdet;
+
+		TripleMultiply(&B[0][0],1,NUMVERTICES,1,
+					&DL_scalar,1,1,0,
+					&Bprime[0][0],1,NUMVERTICES,0,
+					&Ke->values[0],1);
+	} 
+
+	/*Clean up and return*/
+	delete gauss;
+	return Ke;
+}
+/*}}}*/
+/*FUNCTION Tria::CreateKMatrixExtrusionSurface {{{*/
+ElementMatrix* Tria::CreateKMatrixExtrusionSurface(void){
+
+	if (!HasEdgeOnSurface()) return NULL;
+
+	/*Constants*/
+	const int numdof=NDOF1*NUMVERTICES;
+
+	/*Intermediaries */
+	int indices[2];
+	IssmDouble xyz_list[NUMVERTICES][3];
+	IssmDouble xyz_list_seg[NUMVERTICES1D][3];
+	IssmDouble normal[3];
+	IssmDouble Jdet,DL_scalar;
+	IssmDouble basis[NUMVERTICES];
+	GaussTria *gauss=NULL;
+
+	/*Initialize Element matrix*/
+	ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters,NoneApproximationEnum);
+
+	/*Retrieve all inputs and parameters*/
+	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+
+	/*Get vertex indices that lie on bed*/
+	this->EdgeOnSurfaceIndices(&indices[0],&indices[1]);
+	for(int i=0;i<NUMVERTICES1D;i++) for(int j=0;j<2;j++) xyz_list_seg[i][j]=xyz_list[indices[i]][j];
+	GetSegmentNormal(&normal[0],xyz_list_seg);
+
+	/* Start  looping on the number of gaussian points: */
+	gauss=new GaussTria(indices[0],indices[1],2);
+	for(int ig=gauss->begin();ig<gauss->end();ig++){
+
+		gauss->GaussPoint(ig);
+
+		GetSegmentJacobianDeterminant(&Jdet,&xyz_list_seg[0][0],gauss);
+		GetNodalFunctions(&basis[0], gauss);
+
+		DL_scalar= - gauss->weight*Jdet*normal[1]; 
+
+		TripleMultiply( basis,1,numdof,1,
+					&DL_scalar,1,1,0,
+					basis,1,numdof,0,
+					&Ke->values[0],1);
+	}
+
+	/*Clean up and return*/
+	delete gauss;
+	return Ke;
+}
+/*}}}*/
+/*FUNCTION Tria::CreateKMatrixExtrusionBed {{{*/
+ElementMatrix* Tria::CreateKMatrixExtrusionBed(void){
+
+	if (!HasEdgeOnBed()) return NULL;
+
+	/*Constants*/
+	const int numdof=NDOF1*NUMVERTICES;
+
+	/*Intermediaries */
+	int indices[2];
+	IssmDouble xyz_list[NUMVERTICES][3];
+	IssmDouble xyz_list_seg[NUMVERTICES1D][3];
+	IssmDouble normal[3];
+	IssmDouble Jdet,DL_scalar;
+	IssmDouble basis[NUMVERTICES];
+	GaussTria *gauss=NULL;
+
+	/*Initialize Element matrix*/
+	ElementMatrix* Ke=new ElementMatrix(nodes,NUMVERTICES,this->parameters,NoneApproximationEnum);
+
+	/*Retrieve all inputs and parameters*/
+	GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES);
+
+	/*Get vertex indices that lie on bed*/
+	this->EdgeOnBedIndices(&indices[0],&indices[1]);
+	for(int i=0;i<NUMVERTICES1D;i++) for(int j=0;j<2;j++) xyz_list_seg[i][j]=xyz_list[indices[i]][j];
+	GetSegmentNormal(&normal[0],xyz_list_seg);
+
+	/* Start  looping on the number of gaussian points: */
+	gauss=new GaussTria(indices[0],indices[1],2);
+	for(int ig=gauss->begin();ig<gauss->end();ig++){
+
+		gauss->GaussPoint(ig);
+
+		GetSegmentJacobianDeterminant(&Jdet,&xyz_list_seg[0][0],gauss);
+		GetNodalFunctions(&basis[0], gauss);
+
+		DL_scalar= - gauss->weight*Jdet*normal[1]; 
+
+		TripleMultiply( basis,1,numdof,1,
+					&DL_scalar,1,1,0,
+					basis,1,numdof,0,
+					&Ke->values[0],1);
+	}
+
+	/*Clean up and return*/
+	delete gauss;
+	return Ke;
+}
+/*}}}*/
 /*FUNCTION Tria::CreateKMatrixMasstransport {{{*/
 ElementMatrix* Tria::CreateKMatrixMasstransport(void){
Index: /issm/trunk-jpl/src/c/classes/Elements/Tria.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 16441)
+++ /issm/trunk-jpl/src/c/classes/Elements/Tria.h	(revision 16442)
@@ -193,4 +193,8 @@
 		ElementMatrix* CreateKMatrixMasstransport_CG(void);
 		ElementMatrix* CreateKMatrixMasstransport_DG(void);
+		ElementMatrix* CreateKMatrixExtrusion(void);
+		ElementMatrix* CreateKMatrixExtrusionVolume(void);
+		ElementMatrix* CreateKMatrixExtrusionSurface(void);
+		ElementMatrix* CreateKMatrixExtrusionBed(void);
 		ElementMatrix* CreateKMatrixFreeSurfaceTop(void);
 		ElementMatrix* CreateKMatrixFreeSurfaceTop1D(void);
@@ -278,4 +282,6 @@
 		#endif
 
+		void UpdateConstraintsExtrudeFromBase(void);
+		void UpdateConstraintsExtrudeFromTop(void);
 		#ifdef _HAVE_THERMAL_
 		void UpdateBasalConstraintsEnthalpy(void){_error_("not implemented yet");};
Index: /issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp	(revision 16441)
+++ /issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp	(revision 16442)
@@ -198,4 +198,25 @@
 	/*Clean-up*/
 	xDelete<IssmDouble>(basis);
+}
+/*}}}*/
+/*FUNCTION TriaRef::GetBExtrusion{{{*/
+void TriaRef::GetBExtrusion(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss){
+	/*	Compute B  matrix. B=[dh1/dz dh2/dz dh3/dz dh4/dz dh5/dz dh6/dz];
+		where hi is the interpolation function for node i.*/
+
+	/*Fetch number of nodes for this finite element*/
+	int numnodes = this->NumberofNodes();
+
+	/*Get nodal functions derivatives*/
+	IssmDouble* dbasis=xNew<IssmDouble>(2*numnodes);
+	GetNodalFunctionsDerivatives(dbasis,xyz_list,gauss);
+
+	/*Build B: */
+	for(int i=0;i<numnodes;i++){
+		B[i] = dbasis[1*numnodes+i];  
+	}
+
+	/*Clean-up*/
+	xDelete<IssmDouble>(dbasis);
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/classes/Elements/TriaRef.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/TriaRef.h	(revision 16441)
+++ /issm/trunk-jpl/src/c/classes/Elements/TriaRef.h	(revision 16442)
@@ -23,4 +23,5 @@
 
 		/*Numerics*/
+		void GetBExtrusion(IssmDouble* B_prime, IssmDouble* xyz_list, GaussTria* gauss);
 		void GetBFS(IssmDouble* B_prime, IssmDouble* xyz_list, GaussTria* gauss);
 		void GetBSSA(IssmDouble* B, IssmDouble* xyz_list, GaussTria* gauss);
Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 16441)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 16442)
@@ -587,4 +587,22 @@
 }
 /*}}}*/
+void FemModel::UpdateConstraintsExtrudeFromBasex(void){ /*{{{*/
+
+	for(int i=0;i<elements->Size();i++){
+		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
+		element->UpdateConstraintsExtrudeFromBase();
+	}
+
+}
+/*}}}*/
+void FemModel::UpdateConstraintsExtrudeFromTopx(void){ /*{{{*/
+
+	for(int i=0;i<elements->Size();i++){
+		Element* element=dynamic_cast<Element*>(elements->GetObjectByOffset(i));
+		element->UpdateConstraintsExtrudeFromTop();
+	}
+
+}
+/*}}}*/
 #ifdef _HAVE_RESPONSES_
 void FemModel::MassFluxx(IssmDouble* pmass_flux){/*{{{*/
Index: /issm/trunk-jpl/src/c/classes/FemModel.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 16441)
+++ /issm/trunk-jpl/src/c/classes/FemModel.h	(revision 16442)
@@ -96,4 +96,6 @@
 		void UpdateConstraintsx(void);
 		int  UpdateVertexPositionsx(void);
+		void UpdateConstraintsExtrudeFromBasex();
+		void UpdateConstraintsExtrudeFromTopx();
 		#ifdef _HAVE_HYDROLOGY_
 		void HydrologyTransferx(void);
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateDataSets.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateDataSets.cpp	(revision 16441)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateDataSets.cpp	(revision 16442)
@@ -175,4 +175,16 @@
 			CreateLoadsFreeSurfaceBase(ploads,iomodel);
 			UpdateElementsFreeSurfaceBase(elements,iomodel,analysis_counter,analysis_type);
+			break;
+		case ExtrudeFromBaseAnalysisEnum:
+			CreateNodesExtrudeFromBase(pnodes, iomodel);
+			CreateConstraintsExtrudeFromBase(pconstraints,iomodel);
+			CreateLoadsExtrudeFromBase(ploads,iomodel);
+			UpdateElementsExtrudeFromBase(elements,iomodel,analysis_counter,analysis_type);
+			break;
+		case ExtrudeFromTopAnalysisEnum:
+			CreateNodesExtrudeFromTop(pnodes, iomodel);
+			CreateConstraintsExtrudeFromTop(pconstraints,iomodel);
+			CreateLoadsExtrudeFromTop(ploads,iomodel);
+			UpdateElementsExtrudeFromTop(elements,iomodel,analysis_counter,analysis_type);
 			break;
 		#endif
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp	(revision 16441)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/DistributeNumDofs.cpp	(revision 16442)
@@ -125,4 +125,10 @@
 			numdofs=1;
 			break;
+		case ExtrudeFromBaseAnalysisEnum:
+			numdofs=1;
+			break;
+		case ExtrudeFromTopAnalysisEnum:
+			numdofs=1;
+			break;
 		case GiaAnalysisEnum:
 			numdofs=1;
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromBase/CreateConstraintsExtrudeFromBase.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromBase/CreateConstraintsExtrudeFromBase.cpp	(revision 16442)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromBase/CreateConstraintsExtrudeFromBase.cpp	(revision 16442)
@@ -0,0 +1,14 @@
+/*
+ * CreateConstraintsExtrudeFromBase.c:
+ */
+
+#include "../../../toolkits/toolkits.h"
+#include "../../../classes/classes.h"
+#include "../../../shared/shared.h"
+#include "../ModelProcessorx.h"
+
+void	CreateConstraintsExtrudeFromBase(Constraints** pconstraints, IoModel* iomodel){
+
+	/*These are automated*/
+
+}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromBase/CreateLoadsExtrudeFromBase.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromBase/CreateLoadsExtrudeFromBase.cpp	(revision 16442)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromBase/CreateLoadsExtrudeFromBase.cpp	(revision 16442)
@@ -0,0 +1,13 @@
+/*! \file CreateLoadsExtrudeFromBase.c:
+ */
+
+#include "../../../toolkits/toolkits.h"
+#include "../../../classes/classes.h"
+#include "../../../shared/shared.h"
+#include "../ModelProcessorx.h"
+
+void	CreateLoadsExtrudeFromBase(Loads** ploads, IoModel* iomodel){
+
+	/*No loads*/
+
+}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromBase/CreateNodesExtrudeFromBase.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromBase/CreateNodesExtrudeFromBase.cpp	(revision 16442)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromBase/CreateNodesExtrudeFromBase.cpp	(revision 16442)
@@ -0,0 +1,15 @@
+/*
+ * CreateNodesExtrudeFromBase.c:
+ */
+
+#include "../../../toolkits/toolkits.h"
+#include "../../../classes/classes.h"
+#include "../../../shared/shared.h"
+#include "../../MeshPartitionx/MeshPartitionx.h"
+#include "../ModelProcessorx.h"
+
+void	CreateNodesExtrudeFromBase(Nodes** pnodes, IoModel* iomodel){
+
+	CreateNodes(pnodes,iomodel,ExtrudeFromBaseAnalysisEnum,P1Enum);
+
+}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromBase/UpdateElementsExtrudeFromBase.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromBase/UpdateElementsExtrudeFromBase.cpp	(revision 16442)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromBase/UpdateElementsExtrudeFromBase.cpp	(revision 16442)
@@ -0,0 +1,26 @@
+/*
+ * UpdateElementsExtrudeFromBase:
+ */
+
+#include "../../../toolkits/toolkits.h"
+#include "../../../classes/classes.h"
+#include "../../../shared/shared.h"
+#include "../../MeshPartitionx/MeshPartitionx.h"
+#include "../ModelProcessorx.h"
+
+void	UpdateElementsExtrudeFromBase(Elements* elements, IoModel* iomodel,int analysis_counter,int analysis_type){
+
+	/*Update elements: */
+	int counter=0;
+	for(int i=0;i<iomodel->numberofelements;i++){
+		if(iomodel->my_elements[i]){
+			Element* element=(Element*)elements->GetObjectByOffset(counter);
+			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			counter++;
+		}
+	}
+
+	if(iomodel->meshtype==Mesh2DverticalEnum){
+		iomodel->FetchDataToInput(elements,MeshVertexonbedEnum);
+	}
+}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromTop/CreateConstraintsExtrudeFromTop.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromTop/CreateConstraintsExtrudeFromTop.cpp	(revision 16442)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromTop/CreateConstraintsExtrudeFromTop.cpp	(revision 16442)
@@ -0,0 +1,14 @@
+/*
+ * CreateConstraintsExtrudeFromTop.c:
+ */
+
+#include "../../../toolkits/toolkits.h"
+#include "../../../classes/classes.h"
+#include "../../../shared/shared.h"
+#include "../ModelProcessorx.h"
+
+void	CreateConstraintsExtrudeFromTop(Constraints** pconstraints, IoModel* iomodel){
+
+	/*These are automated*/
+
+}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromTop/CreateLoadsExtrudeFromTop.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromTop/CreateLoadsExtrudeFromTop.cpp	(revision 16442)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromTop/CreateLoadsExtrudeFromTop.cpp	(revision 16442)
@@ -0,0 +1,13 @@
+/*! \file CreateLoadsExtrudeFromTop.c:
+ */
+
+#include "../../../toolkits/toolkits.h"
+#include "../../../classes/classes.h"
+#include "../../../shared/shared.h"
+#include "../ModelProcessorx.h"
+
+void	CreateLoadsExtrudeFromTop(Loads** ploads, IoModel* iomodel){
+
+	/*No loads*/
+
+}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromTop/CreateNodesExtrudeFromTop.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromTop/CreateNodesExtrudeFromTop.cpp	(revision 16442)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromTop/CreateNodesExtrudeFromTop.cpp	(revision 16442)
@@ -0,0 +1,15 @@
+/*
+ * CreateNodesExtrudeFromTop.c:
+ */
+
+#include "../../../toolkits/toolkits.h"
+#include "../../../classes/classes.h"
+#include "../../../shared/shared.h"
+#include "../../MeshPartitionx/MeshPartitionx.h"
+#include "../ModelProcessorx.h"
+
+void	CreateNodesExtrudeFromTop(Nodes** pnodes, IoModel* iomodel){
+
+	CreateNodes(pnodes,iomodel,ExtrudeFromTopAnalysisEnum,P1Enum);
+
+}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromTop/UpdateElementsExtrudeFromTop.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromTop/UpdateElementsExtrudeFromTop.cpp	(revision 16442)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ExtrudeFromTop/UpdateElementsExtrudeFromTop.cpp	(revision 16442)
@@ -0,0 +1,26 @@
+/*
+ * UpdateElementsExtrudeFromTop:
+ */
+
+#include "../../../toolkits/toolkits.h"
+#include "../../../classes/classes.h"
+#include "../../../shared/shared.h"
+#include "../../MeshPartitionx/MeshPartitionx.h"
+#include "../ModelProcessorx.h"
+
+void	UpdateElementsExtrudeFromTop(Elements* elements, IoModel* iomodel,int analysis_counter,int analysis_type){
+
+	/*Update elements: */
+	int counter=0;
+	for(int i=0;i<iomodel->numberofelements;i++){
+		if(iomodel->my_elements[i]){
+			Element* element=(Element*)elements->GetObjectByOffset(counter);
+			element->Update(i,iomodel,analysis_counter,analysis_type,P1Enum);
+			counter++;
+		}
+	}
+
+	if(iomodel->meshtype==Mesh2DverticalEnum){
+		iomodel->FetchDataToInput(elements,MeshVertexonsurfaceEnum);
+	}
+}
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 16441)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/ModelProcessorx.h	(revision 16442)
@@ -64,4 +64,16 @@
 void CreateParametersDamage(Parameters** pparameters,IoModel* iomodel,int solution_type,int analysis_type);
 #endif
+
+/*Extrude from base*/
+void CreateNodesExtrudeFromBase(Nodes** pnodes,IoModel* iomodel);
+void CreateConstraintsExtrudeFromBase(Constraints** pconstraints,IoModel* iomodel);
+void CreateLoadsExtrudeFromBase(Loads** ploads, IoModel* iomodel);
+void UpdateElementsExtrudeFromBase(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
+
+/*Extrude from top*/
+void CreateNodesExtrudeFromTop(Nodes** pnodes,IoModel* iomodel);
+void CreateConstraintsExtrudeFromTop(Constraints** pconstraints,IoModel* iomodel);
+void CreateLoadsExtrudeFromTop(Loads** ploads, IoModel* iomodel);
+void UpdateElementsExtrudeFromTop(Elements* elements,IoModel* iomodel,int analysis_counter,int analysis_type);
 
 /*bed slope*/
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 16441)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 16442)
@@ -320,4 +320,6 @@
 	FreeSurfaceBaseAnalysisEnum,
 	FreeSurfaceTopAnalysisEnum,
+	ExtrudeFromBaseAnalysisEnum,
+	ExtrudeFromTopAnalysisEnum,
 	SteadystateSolutionEnum,
 	SurfaceSlopeAnalysisEnum,
@@ -379,4 +381,5 @@
 	InputEnum,
 	IntInputEnum,
+	InputToExtrudeEnum,
 	IntParamEnum,
 	IntVecParamEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 16441)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 16442)
@@ -326,4 +326,6 @@
 		case FreeSurfaceBaseAnalysisEnum : return "FreeSurfaceBaseAnalysis";
 		case FreeSurfaceTopAnalysisEnum : return "FreeSurfaceTopAnalysis";
+		case ExtrudeFromBaseAnalysisEnum : return "ExtrudeFromBaseAnalysis";
+		case ExtrudeFromTopAnalysisEnum : return "ExtrudeFromTopAnalysis";
 		case SteadystateSolutionEnum : return "SteadystateSolution";
 		case SurfaceSlopeAnalysisEnum : return "SurfaceSlopeAnalysis";
@@ -379,4 +381,5 @@
 		case InputEnum : return "Input";
 		case IntInputEnum : return "IntInput";
+		case InputToExtrudeEnum : return "InputToExtrude";
 		case IntParamEnum : return "IntParam";
 		case IntVecParamEnum : return "IntVecParam";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 16441)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 16442)
@@ -332,4 +332,6 @@
 	      else if (strcmp(name,"FreeSurfaceBaseAnalysis")==0) return FreeSurfaceBaseAnalysisEnum;
 	      else if (strcmp(name,"FreeSurfaceTopAnalysis")==0) return FreeSurfaceTopAnalysisEnum;
+	      else if (strcmp(name,"ExtrudeFromBaseAnalysis")==0) return ExtrudeFromBaseAnalysisEnum;
+	      else if (strcmp(name,"ExtrudeFromTopAnalysis")==0) return ExtrudeFromTopAnalysisEnum;
 	      else if (strcmp(name,"SteadystateSolution")==0) return SteadystateSolutionEnum;
 	      else if (strcmp(name,"SurfaceSlopeAnalysis")==0) return SurfaceSlopeAnalysisEnum;
@@ -381,11 +383,12 @@
 	      else if (strcmp(name,"Element")==0) return ElementEnum;
 	      else if (strcmp(name,"ElementResult")==0) return ElementResultEnum;
-	      else if (strcmp(name,"ExternalResult")==0) return ExternalResultEnum;
-	      else if (strcmp(name,"FileParam")==0) return FileParamEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"Input")==0) return InputEnum;
+	      if (strcmp(name,"ExternalResult")==0) return ExternalResultEnum;
+	      else if (strcmp(name,"FileParam")==0) return FileParamEnum;
+	      else if (strcmp(name,"Input")==0) return InputEnum;
 	      else if (strcmp(name,"IntInput")==0) return IntInputEnum;
+	      else if (strcmp(name,"InputToExtrude")==0) return InputToExtrudeEnum;
 	      else if (strcmp(name,"IntParam")==0) return IntParamEnum;
 	      else if (strcmp(name,"IntVecParam")==0) return IntVecParamEnum;
@@ -503,11 +506,11 @@
 	      else if (strcmp(name,"QmuTemperature")==0) return QmuTemperatureEnum;
 	      else if (strcmp(name,"HydrologyWaterVx")==0) return HydrologyWaterVxEnum;
-	      else if (strcmp(name,"HydrologyWaterVy")==0) return HydrologyWaterVyEnum;
-	      else if (strcmp(name,"StressTensor")==0) return StressTensorEnum;
-	      else if (strcmp(name,"StressTensorxx")==0) return StressTensorxxEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"StressTensorxy")==0) return StressTensorxyEnum;
+	      if (strcmp(name,"HydrologyWaterVy")==0) return HydrologyWaterVyEnum;
+	      else if (strcmp(name,"StressTensor")==0) return StressTensorEnum;
+	      else if (strcmp(name,"StressTensorxx")==0) return StressTensorxxEnum;
+	      else if (strcmp(name,"StressTensorxy")==0) return StressTensorxyEnum;
 	      else if (strcmp(name,"StressTensorxz")==0) return StressTensorxzEnum;
 	      else if (strcmp(name,"StressTensoryy")==0) return StressTensoryyEnum;
