Index: /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 17077)
+++ /issm/trunk-jpl/src/c/analyses/MasstransportAnalysis.cpp	(revision 17078)
@@ -89,4 +89,23 @@
 		case SMBEnum:
 			iomodel->FetchDataToInput(elements,SurfaceforcingsMassBalanceEnum,0.);
+			break;
+		case SMBpddEnum:
+			iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
+			iomodel->FetchDataToInput(elements,ThermalSpctemperatureEnum);
+			if(isdelta18o){
+				iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesLgmEnum);
+				iomodel->FetchDataToInput(elements,SurfaceforcingsTemperaturesPresentdayEnum);
+				iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationsPresentdayEnum);
+			}
+			else{
+				iomodel->FetchDataToInput(elements,SurfaceforcingsPrecipitationEnum);
+				iomodel->FetchDataToInput(elements,SurfaceforcingsMonthlytemperaturesEnum);
+			}
+			break;
+		case SMBgradientsEnum:
+			iomodel->FetchDataToInput(elements,SurfaceforcingsHrefEnum);
+			iomodel->FetchDataToInput(elements,SurfaceforcingsSmbrefEnum);
+			iomodel->FetchDataToInput(elements,SurfaceforcingsBPosEnum);
+			iomodel->FetchDataToInput(elements,SurfaceforcingsBNegEnum);
 			break;
 		case SurfaceforcingsEnum: /*To Be REMOVED*/
Index: /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 17077)
+++ /issm/trunk-jpl/src/c/classes/Materials/Matpar.cpp	(revision 17078)
@@ -45,4 +45,11 @@
 	switch(smb_model){
 		case SMBEnum:
+			/*Nothing to add*/
+			break;
+		case SMBpddEnum:
+			iomodel->Constant(&this->desfac,SurfaceforcingsDesfacEnum);
+			iomodel->Constant(&this->s0p,SurfaceforcingsS0pEnum);
+			break;
+		case SMBgradientsEnum:
 			/*Nothing to add*/
 			break;
Index: /issm/trunk-jpl/src/c/cores/masstransport_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/masstransport_core.cpp	(revision 17077)
+++ /issm/trunk-jpl/src/c/cores/masstransport_core.cpp	(revision 17078)
@@ -44,4 +44,17 @@
 		case SMBEnum:
 			/*Nothing to be done*/
+			break;
+		case SMBpddEnum:
+			femmodel->parameters->FindParam(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
+			if(isdelta18o){
+				if(VerboseSolution()) _printf0_("   call Delta18oParametrization module\n");
+				Delta18oParameterizationx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
+			} 
+			if(VerboseSolution()) _printf0_("   call positive degree day module\n");
+			PositiveDegreeDayx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
+			break;
+		case SMBgradientsEnum:
+			if(VerboseSolution())_printf_("	call smb gradients module\n\n");
+			SmbGradientsx(femmodel->elements,femmodel->nodes,femmodel->vertices,femmodel->loads,femmodel->materials,femmodel->parameters);
 			break;
 		case SurfaceforcingsEnum: /*To Be REMOVED*/
Index: /issm/trunk-jpl/src/c/cores/transient_core.cpp
===================================================================
--- /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 17077)
+++ /issm/trunk-jpl/src/c/cores/transient_core.cpp	(revision 17078)
@@ -22,9 +22,9 @@
 	int    i;
 	IssmDouble starttime,finaltime,dt,yts;
-	bool   isstressbalance,ismasstransport,isFS,isthermal,isgroundingline,isdelta18o,isgia,islevelset;
+	bool   isstressbalance,ismasstransport,isFS,isthermal,isgroundingline,isgia,islevelset;
 	bool   save_results,dakota_analysis;
 	bool   time_adapt=false;
 	int    output_frequency;
-	int    meshtype,groundingline_migration;
+	int    meshtype,groundingline_migration,smb_model;
 	int    numoutputs         = 0;
   Analysis *analysis = NULL;
@@ -54,5 +54,4 @@
 	femmodel->parameters->FindParam(&numoutputs,TransientNumRequestedOutputsEnum);
 	if(numoutputs) femmodel->parameters->FindParam(&requested_outputs,&numoutputs,TransientRequestedOutputsEnum);
-	femmodel->parameters->FindParam(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
 
 	/*initialize: */
@@ -170,8 +169,4 @@
 		if(VerboseSolution()) _printf0_("   computing requested outputs\n");
 		femmodel->RequestedOutputsx(&femmodel->results,requested_outputs,numoutputs,save_results);
-		if(isdelta18o){
-			int outputs[2] = {SurfaceforcingsMonthlytemperaturesEnum,SurfaceforcingsPrecipitationEnum};
-			femmodel->RequestedOutputsx(&femmodel->results,&outputs[0],2,save_results);
-		}
 		if(isgroundingline && (groundingline_migration==SubelementMigrationEnum || groundingline_migration==SubelementMigration2Enum)){
 			int outputs[1] = {MaskGroundediceLevelsetEnum};
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 17077)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 17078)
@@ -91,4 +91,28 @@
 			/*Nothing to add to parameters*/
 			break;
+		case SMBpddEnum:
+			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsIsdelta18oEnum));
+			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsDesfacEnum));
+			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsS0pEnum));
+			iomodel->Constant(&isdelta18o,SurfaceforcingsIsdelta18oEnum);
+			if(isdelta18o){
+				IssmDouble *temp = NULL;
+				IssmDouble  yts;
+				int         N,M;
+				iomodel->Constant(&yts,ConstantsYtsEnum);
+				iomodel->FetchData(&temp,&N,&M,SurfaceforcingsDelta18oEnum); _assert_(N==2);
+				for(i=0;i<M;i++) temp[M+i]=yts*temp[M+i];
+				parameters->AddObject(new TransientParam(SurfaceforcingsDelta18oEnum,&temp[0],&temp[M],M));
+				iomodel->DeleteData(temp,SurfaceforcingsDelta18oEnum);
+
+				iomodel->FetchData(&temp,&N,&M,SurfaceforcingsDelta18oSurfaceEnum); _assert_(N==2);
+				for(i=0;i<M;i++) temp[M+i]=yts*temp[M+i];
+				parameters->AddObject(new TransientParam(SurfaceforcingsDelta18oSurfaceEnum,&temp[0],&temp[M],M));
+				iomodel->DeleteData(temp,SurfaceforcingsDelta18oSurfaceEnum);
+			}
+			break;
+		case SMBgradientsEnum:
+			/*Nothing to add to parameters*/
+			break;
 		case SurfaceforcingsEnum: /*To Be REMOVED*/
 			parameters->AddObject(iomodel->CopyConstantObject(SurfaceforcingsIspddEnum));
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 17077)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 17078)
@@ -281,5 +281,5 @@
 	SMBEnum,
 	SurfaceforcingsMassBalanceEnum,
-
+	SMBpddEnum,
 	SurfaceforcingsDelta18oEnum,
 	SurfaceforcingsDelta18oSurfaceEnum,
@@ -289,8 +289,7 @@
 	SurfaceforcingsTemperaturesLgmEnum,
 	SurfaceforcingsPrecipitationEnum,
-	SurfaceforcingsIspddEnum,
 	SurfaceforcingsDesfacEnum,
 	SurfaceforcingsS0pEnum,
-	SurfaceforcingsIssmbgradientsEnum,
+	SMBgradientsEnum,
 	SurfaceforcingsMonthlytemperaturesEnum,
 	SurfaceforcingsHrefEnum,
@@ -298,4 +297,8 @@
 	SurfaceforcingsBPosEnum,
 	SurfaceforcingsBNegEnum,
+	SMBlapserate,
+	/*TO BE REMOVED*/
+	SurfaceforcingsIspddEnum,
+	SurfaceforcingsIssmbgradientsEnum,
 	/*}}}*/
 	/*Solutions and Analyses{{{ */
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 17077)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 17078)
@@ -285,4 +285,5 @@
 		case SMBEnum : return "SMB";
 		case SurfaceforcingsMassBalanceEnum : return "SurfaceforcingsMassBalance";
+		case SMBpddEnum : return "SMBpdd";
 		case SurfaceforcingsDelta18oEnum : return "SurfaceforcingsDelta18o";
 		case SurfaceforcingsDelta18oSurfaceEnum : return "SurfaceforcingsDelta18oSurface";
@@ -292,8 +293,7 @@
 		case SurfaceforcingsTemperaturesLgmEnum : return "SurfaceforcingsTemperaturesLgm";
 		case SurfaceforcingsPrecipitationEnum : return "SurfaceforcingsPrecipitation";
-		case SurfaceforcingsIspddEnum : return "SurfaceforcingsIspdd";
 		case SurfaceforcingsDesfacEnum : return "SurfaceforcingsDesfac";
 		case SurfaceforcingsS0pEnum : return "SurfaceforcingsS0p";
-		case SurfaceforcingsIssmbgradientsEnum : return "SurfaceforcingsIssmbgradients";
+		case SMBgradientsEnum : return "SMBgradients";
 		case SurfaceforcingsMonthlytemperaturesEnum : return "SurfaceforcingsMonthlytemperatures";
 		case SurfaceforcingsHrefEnum : return "SurfaceforcingsHref";
@@ -301,4 +301,6 @@
 		case SurfaceforcingsBPosEnum : return "SurfaceforcingsBPos";
 		case SurfaceforcingsBNegEnum : return "SurfaceforcingsBNeg";
+		case SurfaceforcingsIspddEnum : return "SurfaceforcingsIspdd";
+		case SurfaceforcingsIssmbgradientsEnum : return "SurfaceforcingsIssmbgradients";
 		case SolutionTypeEnum : return "SolutionType";
 		case AnalysisTypeEnum : return "AnalysisType";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 17077)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 17078)
@@ -291,4 +291,5 @@
 	      else if (strcmp(name,"SMB")==0) return SMBEnum;
 	      else if (strcmp(name,"SurfaceforcingsMassBalance")==0) return SurfaceforcingsMassBalanceEnum;
+	      else if (strcmp(name,"SMBpdd")==0) return SMBpddEnum;
 	      else if (strcmp(name,"SurfaceforcingsDelta18o")==0) return SurfaceforcingsDelta18oEnum;
 	      else if (strcmp(name,"SurfaceforcingsDelta18oSurface")==0) return SurfaceforcingsDelta18oSurfaceEnum;
@@ -298,8 +299,7 @@
 	      else if (strcmp(name,"SurfaceforcingsTemperaturesLgm")==0) return SurfaceforcingsTemperaturesLgmEnum;
 	      else if (strcmp(name,"SurfaceforcingsPrecipitation")==0) return SurfaceforcingsPrecipitationEnum;
-	      else if (strcmp(name,"SurfaceforcingsIspdd")==0) return SurfaceforcingsIspddEnum;
 	      else if (strcmp(name,"SurfaceforcingsDesfac")==0) return SurfaceforcingsDesfacEnum;
 	      else if (strcmp(name,"SurfaceforcingsS0p")==0) return SurfaceforcingsS0pEnum;
-	      else if (strcmp(name,"SurfaceforcingsIssmbgradients")==0) return SurfaceforcingsIssmbgradientsEnum;
+	      else if (strcmp(name,"SMBgradients")==0) return SMBgradientsEnum;
 	      else if (strcmp(name,"SurfaceforcingsMonthlytemperatures")==0) return SurfaceforcingsMonthlytemperaturesEnum;
 	      else if (strcmp(name,"SurfaceforcingsHref")==0) return SurfaceforcingsHrefEnum;
@@ -307,4 +307,6 @@
 	      else if (strcmp(name,"SurfaceforcingsBPos")==0) return SurfaceforcingsBPosEnum;
 	      else if (strcmp(name,"SurfaceforcingsBNeg")==0) return SurfaceforcingsBNegEnum;
+	      else if (strcmp(name,"SurfaceforcingsIspdd")==0) return SurfaceforcingsIspddEnum;
+	      else if (strcmp(name,"SurfaceforcingsIssmbgradients")==0) return SurfaceforcingsIssmbgradientsEnum;
 	      else if (strcmp(name,"SolutionType")==0) return SolutionTypeEnum;
 	      else if (strcmp(name,"AnalysisType")==0) return AnalysisTypeEnum;
@@ -381,12 +383,12 @@
 	      else if (strcmp(name,"BoolInput")==0) return BoolInputEnum;
 	      else if (strcmp(name,"BoolParam")==0) return BoolParamEnum;
-	      else if (strcmp(name,"Contour")==0) return ContourEnum;
+         else stage=4;
+   }
+   if(stage==4){
+	      if (strcmp(name,"Contour")==0) return ContourEnum;
 	      else if (strcmp(name,"ControlInput")==0) return ControlInputEnum;
 	      else if (strcmp(name,"DatasetInput")==0) return DatasetInputEnum;
 	      else if (strcmp(name,"DoubleInput")==0) return DoubleInputEnum;
-         else stage=4;
-   }
-   if(stage==4){
-	      if (strcmp(name,"DataSetParam")==0) return DataSetParamEnum;
+	      else if (strcmp(name,"DataSetParam")==0) return DataSetParamEnum;
 	      else if (strcmp(name,"DoubleMatArrayParam")==0) return DoubleMatArrayParamEnum;
 	      else if (strcmp(name,"DoubleMatParam")==0) return DoubleMatParamEnum;
@@ -504,12 +506,12 @@
 	      else if (strcmp(name,"ThicknessAbsGradient")==0) return ThicknessAbsGradientEnum;
 	      else if (strcmp(name,"ThicknessAlongGradient")==0) return ThicknessAlongGradientEnum;
-	      else if (strcmp(name,"ThicknessAcrossGradient")==0) return ThicknessAcrossGradientEnum;
+         else stage=5;
+   }
+   if(stage==5){
+	      if (strcmp(name,"ThicknessAcrossGradient")==0) return ThicknessAcrossGradientEnum;
 	      else if (strcmp(name,"IntMatParam")==0) return IntMatParamEnum;
 	      else if (strcmp(name,"RheologyBbarAbsGradient")==0) return RheologyBbarAbsGradientEnum;
 	      else if (strcmp(name,"DragCoefficientAbsGradient")==0) return DragCoefficientAbsGradientEnum;
-         else stage=5;
-   }
-   if(stage==5){
-	      if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
+	      else if (strcmp(name,"TransientInput")==0) return TransientInputEnum;
 	      else if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum;
 	      else if (strcmp(name,"Watercolumn")==0) return WatercolumnEnum;
@@ -627,12 +629,12 @@
 	      else if (strcmp(name,"BilinearInterp")==0) return BilinearInterpEnum;
 	      else if (strcmp(name,"NearestInterp")==0) return NearestInterpEnum;
-	      else if (strcmp(name,"XY")==0) return XYEnum;
+         else stage=6;
+   }
+   if(stage==6){
+	      if (strcmp(name,"XY")==0) return XYEnum;
 	      else if (strcmp(name,"XYZ")==0) return XYZEnum;
 	      else if (strcmp(name,"Dense")==0) return DenseEnum;
 	      else if (strcmp(name,"MpiDense")==0) return MpiDenseEnum;
-         else stage=6;
-   }
-   if(stage==6){
-	      if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
+	      else if (strcmp(name,"MpiSparse")==0) return MpiSparseEnum;
 	      else if (strcmp(name,"Seq")==0) return SeqEnum;
 	      else if (strcmp(name,"Mpi")==0) return MpiEnum;
Index: /issm/trunk-jpl/src/m/classes/SMBgradients.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/SMBgradients.m	(revision 17078)
+++ /issm/trunk-jpl/src/m/classes/SMBgradients.m	(revision 17078)
@@ -0,0 +1,63 @@
+%SMBgradients Class definition
+%
+%   Usage:
+%      SMBgradients=SMBgradients();
+
+classdef SMBgradients
+	properties (SetAccess=public) 
+		href   = NaN;
+		smbref = NaN;
+		b_pos  = NaN;
+		b_neg  = NaN;
+	end
+	methods
+		function obj = SMBgradients(varargin) % {{{
+			switch nargin
+				case 0
+					obj=setdefaultparameters(obj);
+				otherwise
+					error('constructor not supported');
+			end
+		end % }}}
+		function self = initialize(self,md) % {{{
+
+			%Nothing done for now
+
+		end % }}}
+		function obj = setdefaultparameters(obj) % {{{
+
+			%Nothing for now
+
+		end % }}}
+		function md = checkconsistency(obj,md,solution,analyses) % {{{
+
+			if ismember(MasstransportAnalysisEnum(),analyses),
+				md = checkfield(md,'fieldname','surfaceforcings.href','forcing',1,'NaN',1);
+				md = checkfield(md,'fieldname','surfaceforcings.smbref','forcing',1,'NaN',1);
+				md = checkfield(md,'fieldname','surfaceforcings.b_pos','forcing',1,'NaN',1);
+				md = checkfield(md,'fieldname','surfaceforcings.b_neg','forcing',1,'NaN',1);
+			end
+		end % }}}
+		function disp(obj) % {{{
+			disp(sprintf('   surface forcings parameters:'));
+
+			disp(sprintf('\n   SMB gradients parameters:'));
+			fielddisplay(obj,'href',' reference elevation from which deviation is used to calculate SMB adjustment in smb gradients method');
+			fielddisplay(obj,'smbref',' reference smb from which deviation is calculated in smb gradients method');
+			fielddisplay(obj,'b_pos',' slope of hs - smb regression line for accumulation regime required if smb gradients is activated');
+			fielddisplay(obj,'b_neg',' slope of hs - smb regression line for ablation regime required if smb gradients is activated');
+
+		end % }}}
+		function marshall(obj,md,fid) % {{{
+
+			yts=365.0*24.0*3600.0;
+
+			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBgradientsEnum(),'format','Integer');
+			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','href','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','b_pos','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','b_neg','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+
+		end % }}}
+	end
+end
Index: /issm/trunk-jpl/src/m/classes/SMBgradients.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/SMBgradients.py	(revision 17078)
+++ /issm/trunk-jpl/src/m/classes/SMBgradients.py	(revision 17078)
@@ -0,0 +1,56 @@
+from fielddisplay import fielddisplay
+from EnumDefinitions import *
+from checkfield import *
+from WriteData import *
+
+class SMBgradients(object):
+	"""
+	SMBgradients Class definition
+
+	   Usage:
+	      SMBgradients=SMBgradients();
+	"""
+
+	def __init__(self): # {{{
+		self.href    = float('NaN')
+		self.smbref  = float('NaN')
+		self.b_pos   = float('NaN')
+		self.b_neg   = float('NaN')
+		#}}}
+	def __repr__(self): # {{{
+		string="   surface forcings parameters:"
+
+		string="%s\n%s"%(string,fielddisplay(self,'issmbgradients','is smb gradients method activated (0 or 1, default is 0)'))
+		string="%s\n%s"%(string,fielddisplay(self,'href',' reference elevation from which deviation is used to calculate SMB adjustment in smb gradients method'))
+		string="%s\n%s"%(string,fielddisplay(self,'smbref',' reference smb from which deviation is calculated in smb gradients method'))
+		string="%s\n%s"%(string,fielddisplay(self,'b_pos',' slope of hs - smb regression line for accumulation regime required if smb gradients is activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'b_neg',' slope of hs - smb regression line for ablation regime required if smb gradients is activated'))
+
+		return string
+		#}}}
+	def initialize(self,md): # {{{
+
+		#Nothing for now
+
+		return self
+	#}}}
+	def checkconsistency(self,md,solution,analyses):    # {{{
+
+		if MasstransportAnalysisEnum() in analyses:
+			md = checkfield(md,'fieldname','surfaceforcings.href','forcing',1,'NaN',1)
+			md = checkfield(md,'fieldname','surfaceforcings.smbref','forcing',1,'NaN',1)
+			md = checkfield(md,'fieldname','surfaceforcings.b_pos','forcing',1,'NaN',1)
+			md = checkfield(md,'fieldname','surfaceforcings.b_neg','forcing',1,'NaN',1)
+
+		return md
+	# }}}
+	def marshall(self,md,fid):    # {{{
+
+		yts=365.0*24.0*3600.0
+
+		WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBgradientsEnum(),'format','Integer');
+		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','href','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
+		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','smbref','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','b_pos','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','b_neg','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+	# }}}
Index: /issm/trunk-jpl/src/m/classes/SMBpdd.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/SMBpdd.m	(revision 17078)
+++ /issm/trunk-jpl/src/m/classes/SMBpdd.m	(revision 17078)
@@ -0,0 +1,96 @@
+%SMBpdd Class definition
+%
+%   Usage:
+%      SMBpdd=SMBpdd();
+
+classdef SMBpdd
+	properties (SetAccess=public) 
+		precipitation             = NaN;
+		monthlytemperatures       = NaN;
+		desfac                    = 0.5;
+		s0p                       = 0;
+		isdelta18o                = 0;
+		delta18o                  = NaN;
+		delta18o_surface          = NaN;
+		temperatures_presentday   = NaN;
+		temperatures_lgm          = NaN;
+		precipitations_presentday = NaN;
+	end
+	methods
+		function obj = SMBpdd(varargin) % {{{
+			switch nargin
+				case 0
+					obj=setdefaultparameters(obj);
+				otherwise
+					error('constructor not supported');
+			end
+		end % }}}
+		function self = initialize(self,md) % {{{
+
+			if isnan(self.precipitation),
+				self.precipitation=zeros(md.mesh.numberofvertices,1);
+				disp('      no SMBpdd.precipitation specified: values set as zero');
+			end
+
+		end % }}}
+		function obj = setdefaultparameters(obj) % {{{
+
+		  obj.isdelta18o = 0;
+		  obj.desfac     = 0.5;
+		  obj.s0p        = 0;
+		end % }}}
+		function md = checkconsistency(obj,md,solution,analyses) % {{{
+
+			if ismember(MasstransportAnalysisEnum(),analyses),
+				md = checkfield(md,'fieldname','surfaceforcings.desfac','<=',1,'numel',1);
+				md = checkfield(md,'fieldname','surfaceforcings.s0p','>=',0,'numel',1);
+				if(obj.isdelta18o==0)
+					md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','forcing',1,'NaN',1);
+					md = checkfield(md,'fieldname','surfaceforcings.precipitation','forcing',1,'NaN',1);
+				else
+					md = checkfield(md,'fieldname','surfaceforcings.delta18o','NaN',1);
+					md = checkfield(md,'fieldname','surfaceforcings.delta18o_surface','NaN',1);
+					md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+					md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+					md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1 12],'NaN',1);
+				end
+			end
+		end % }}}
+		function disp(obj) % {{{
+			disp(sprintf('   surface forcings parameters:'));
+
+			disp(sprintf('\n   PDD and deltaO18 parameters:'));
+			fielddisplay(obj,'isdelta18o','is temperature and precipitation delta18o parametrisation activated (0 or 1, default is 0)');
+			fielddisplay(obj,'desfac','desertification elevation factor (between 0 and 1, default is 0.5) [m]');
+			fielddisplay(obj,'s0p','should be set to elevation from precip source (between 0 and a few 1000s m, default is 0) [m]');
+			fielddisplay(obj,'monthlytemperatures','monthly surface temperatures [K], required if pdd is activated and delta18o not activated');
+			fielddisplay(obj,'precipitation','surface precipitation [m/yr water eq]');
+			fielddisplay(obj,'temperatures_presentday','monthly present day surface temperatures [K], required if pdd is activated and delta18o activated');
+			fielddisplay(obj,'temperatures_lgm','monthly LGM surface temperatures [K], required if pdd is activated and delta18o activated');
+			fielddisplay(obj,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o activated');
+			fielddisplay(obj,'delta18o','delta18o, required if pdd is activated and delta18o activated');
+			fielddisplay(obj,'delta18o_surface','surface elevation of the delta18o site, required if pdd is activated and delta18o activated');
+
+		end % }}}
+		function marshall(obj,md,fid) % {{{
+
+			yts=365.0*24.0*3600.0;
+
+			WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBpddEnum(),'format','Integer');
+
+			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1);
+			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','desfac','format','Double');
+			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','s0p','format','Double');
+			WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','isdelta18o','format','Boolean');
+			if obj.isdelta18o
+				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1);
+				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1);
+				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1);
+				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','delta18o_surface','format','DoubleMat','mattype',1);
+				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','delta18o','format','DoubleMat','mattype',1);
+			else
+				WriteData(fid,'object',obj,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1);
+			end
+		end % }}}
+	end
+end
Index: /issm/trunk-jpl/src/m/classes/SMBpdd.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/SMBpdd.py	(revision 17078)
+++ /issm/trunk-jpl/src/m/classes/SMBpdd.py	(revision 17078)
@@ -0,0 +1,97 @@
+from fielddisplay import fielddisplay
+from EnumDefinitions import *
+from checkfield import *
+from WriteData import *
+
+class SMBpdd(object):
+	"""
+	SMBpdd Class definition
+
+	   Usage:
+	      SMBpdd=SMBpdd();
+	"""
+
+	def __init__(self): # {{{
+		self.precipitation             = float('NaN')
+		self.monthlytemperatures       = float('NaN')
+		self.desfac                    = 0.
+		self.s0p                       = 0.
+		self.isdelta18o                = 0
+		self.delta18o                  = float('NaN')
+		self.delta18o_surface          = float('NaN')
+		self.temperatures_presentday   = float('NaN')
+		self.temperatures_lgm          = float('NaN')
+		self.precipitations_presentday = float('NaN')
+
+		#set defaults
+		self.setdefaultparameters()
+		#}}}
+	def __repr__(self): # {{{
+		string="   surface forcings parameters:"
+
+		string="%s\n%s"%(string,fielddisplay(self,'precipitation','surface precipitation [m/yr water eq]'))
+		string="%s\n%s"%(string,fielddisplay(self,'desfac','desertification elevation factor (between 0 and 1, default is 0.5) [m]'))
+		string="%s\n%s"%(string,fielddisplay(self,'isdelta18o','is temperature and precipitation delta18o parametrisation activated (0 or 1, default is 0)'))
+		string="%s\n%s"%(string,fielddisplay(self,'s0p','should be set to elevation from precip source (between 0 and a few 1000s m, default is 0) [m]'))
+		string="%s\n%s"%(string,fielddisplay(self,'monthlytemperatures','monthly surface temperatures [K], required if pdd is activated and delta18o not activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'temperatures_presentday','monthly present day surface temperatures [K], required if pdd is activated and delta18o activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'temperatures_lgm','monthly LGM surface temperatures [K], required if pdd is activated and delta18o activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'precipitations_presentday','monthly surface precipitation [m/yr water eq], required if pdd is activated and delta18o activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'delta18o','delta18o, required if pdd is activated and delta18o activated'))
+		string="%s\n%s"%(string,fielddisplay(self,'delta18o_surface','surface elevation of the delta18o site, required if pdd is activated and delta18o activated'))
+
+		return string
+		#}}}
+	def initialize(self,md): # {{{
+
+		if numpy.all(numpy.isnan(self.precipitation)):
+			self.precipitation=numpy.zeros((md.mesh.numberofvertices,1))
+			print "      no SMBpdd.precipitation specified: values set as zero"
+
+		return self
+	#}}}
+	def setdefaultparameters(self): # {{{
+		  
+		#pdd method not used in default mode
+		self.isdelta18o = 0
+		self.desfac     = 0.5
+		self.s0p        = 0.
+
+		return self
+	#}}}
+	def checkconsistency(self,md,solution,analyses):    # {{{
+
+		if MasstransportAnalysisEnum() in analyses:
+			md = checkfield(md,'fieldname','surfaceforcings.desfac','<=',1,'numel',[1]);
+			md = checkfield(md,'fieldname','surfaceforcings.s0p','>=',0,'numel',[1]);
+			if not self.isdelta18o:
+				md = checkfield(md,'fieldname','surfaceforcings.monthlytemperatures','forcing',1,'NaN',1)
+				md = checkfield(md,'fieldname','surfaceforcings.precipitation','forcing',1,'NaN',1)
+			else:
+				md = checkfield(md,'fieldname','surfaceforcings.delta18o','NaN',1)
+				md = checkfield(md,'fieldname','surfaceforcings.delta18o_surface','NaN',1)
+				md = checkfield(md,'fieldname','surfaceforcings.temperatures_presentday','size',[md.mesh.numberofvertices+1,12],'NaN',1)
+				md = checkfield(md,'fieldname','surfaceforcings.temperatures_lgm','size',[md.mesh.numberofvertices+1,12],'NaN',1)
+				md = checkfield(md,'fieldname','surfaceforcings.precipitations_presentday','size',[md.mesh.numberofvertices+1,12],'NaN',1)
+
+		return md
+	# }}}
+	def marshall(self,md,fid):    # {{{
+
+		yts=365.0*24.0*3600.0
+
+		WriteData(fid,'enum',SurfaceforcingsEnum(),'data',SMBpddEnum(),'format','Integer');
+
+		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitation','format','DoubleMat','mattype',1,'scale',1./yts,'forcinglength',md.mesh.numberofvertices+1)
+		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','isdelta18o','format','Boolean')
+		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','desfac','format','Double');
+		WriteData(fid,'object',self,'class','surfaceforcings','fieldname','s0p','format','Double');
+		if self.isdelta18o:
+			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_presentday','format','DoubleMat','mattype',1)
+			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','temperatures_lgm','format','DoubleMat','mattype',1)
+			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','precipitations_presentday','format','DoubleMat','mattype',1)
+			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','delta18o_surface','format','DoubleMat','mattype',1)
+			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','delta18o','format','DoubleMat','mattype',1)
+		else:
+			WriteData(fid,'object',self,'class','surfaceforcings','fieldname','monthlytemperatures','format','DoubleMat','mattype',1,'forcinglength',md.mesh.numberofvertices+1)
+	# }}}
Index: /issm/trunk-jpl/src/m/classes/model.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/model.py	(revision 17077)
+++ /issm/trunk-jpl/src/m/classes/model.py	(revision 17078)
@@ -9,4 +9,6 @@
 from surfaceforcings import surfaceforcings
 from SMB import SMB
+from SMBpdd import SMBpdd
+from SMBgradients import SMBgradients
 from basalforcings import basalforcings
 from matice import matice
Index: /issm/trunk-jpl/src/m/enum/EnumDefinitions.py
===================================================================
--- /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 17077)
+++ /issm/trunk-jpl/src/m/enum/EnumDefinitions.py	(revision 17078)
@@ -277,4 +277,5 @@
 def SMBEnum(): return StringToEnum("SMB")[0]
 def SurfaceforcingsMassBalanceEnum(): return StringToEnum("SurfaceforcingsMassBalance")[0]
+def SMBpddEnum(): return StringToEnum("SMBpdd")[0]
 def SurfaceforcingsDelta18oEnum(): return StringToEnum("SurfaceforcingsDelta18o")[0]
 def SurfaceforcingsDelta18oSurfaceEnum(): return StringToEnum("SurfaceforcingsDelta18oSurface")[0]
@@ -284,8 +285,7 @@
 def SurfaceforcingsTemperaturesLgmEnum(): return StringToEnum("SurfaceforcingsTemperaturesLgm")[0]
 def SurfaceforcingsPrecipitationEnum(): return StringToEnum("SurfaceforcingsPrecipitation")[0]
-def SurfaceforcingsIspddEnum(): return StringToEnum("SurfaceforcingsIspdd")[0]
 def SurfaceforcingsDesfacEnum(): return StringToEnum("SurfaceforcingsDesfac")[0]
 def SurfaceforcingsS0pEnum(): return StringToEnum("SurfaceforcingsS0p")[0]
-def SurfaceforcingsIssmbgradientsEnum(): return StringToEnum("SurfaceforcingsIssmbgradients")[0]
+def SMBgradientsEnum(): return StringToEnum("SMBgradients")[0]
 def SurfaceforcingsMonthlytemperaturesEnum(): return StringToEnum("SurfaceforcingsMonthlytemperatures")[0]
 def SurfaceforcingsHrefEnum(): return StringToEnum("SurfaceforcingsHref")[0]
@@ -293,4 +293,6 @@
 def SurfaceforcingsBPosEnum(): return StringToEnum("SurfaceforcingsBPos")[0]
 def SurfaceforcingsBNegEnum(): return StringToEnum("SurfaceforcingsBNeg")[0]
+def SurfaceforcingsIspddEnum(): return StringToEnum("SurfaceforcingsIspdd")[0]
+def SurfaceforcingsIssmbgradientsEnum(): return StringToEnum("SurfaceforcingsIssmbgradients")[0]
 def SolutionTypeEnum(): return StringToEnum("SolutionType")[0]
 def AnalysisTypeEnum(): return StringToEnum("AnalysisType")[0]
Index: /issm/trunk-jpl/src/m/enum/LevelsetAnalysisEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/LevelsetAnalysisEnum.m	(revision 17078)
+++ /issm/trunk-jpl/src/m/enum/LevelsetAnalysisEnum.m	(revision 17078)
@@ -0,0 +1,11 @@
+function macro=LevelsetAnalysisEnum()
+%LEVELSETANALYSISENUM - Enum of LevelsetAnalysis
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=LevelsetAnalysisEnum()
+
+macro=StringToEnum('LevelsetAnalysis');
Index: /issm/trunk-jpl/src/m/enum/SMBgradientsEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/SMBgradientsEnum.m	(revision 17078)
+++ /issm/trunk-jpl/src/m/enum/SMBgradientsEnum.m	(revision 17078)
@@ -0,0 +1,11 @@
+function macro=SMBgradientsEnum()
+%SMBGRADIENTSENUM - Enum of SMBgradients
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=SMBgradientsEnum()
+
+macro=StringToEnum('SMBgradients');
Index: /issm/trunk-jpl/src/m/enum/SMBpddEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/SMBpddEnum.m	(revision 17078)
+++ /issm/trunk-jpl/src/m/enum/SMBpddEnum.m	(revision 17078)
@@ -0,0 +1,11 @@
+function macro=SMBpddEnum()
+%SMBPDDENUM - Enum of SMBpdd
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=SMBpddEnum()
+
+macro=StringToEnum('SMBpdd');
Index: /issm/trunk-jpl/src/m/enum/TransientIslevelsetEnum.m
===================================================================
--- /issm/trunk-jpl/src/m/enum/TransientIslevelsetEnum.m	(revision 17078)
+++ /issm/trunk-jpl/src/m/enum/TransientIslevelsetEnum.m	(revision 17078)
@@ -0,0 +1,11 @@
+function macro=TransientIslevelsetEnum()
+%TRANSIENTISLEVELSETENUM - Enum of TransientIslevelset
+%
+%   WARNING: DO NOT MODIFY THIS FILE
+%            this file has been automatically generated by src/c/shared/Enum/Synchronize.sh
+%            Please read src/c/shared/Enum/README for more information
+%
+%   Usage:
+%      macro=TransientIslevelsetEnum()
+
+macro=StringToEnum('TransientIslevelset');
