Index: /issm/trunk-jpl/src/c/Makefile.am
===================================================================
--- /issm/trunk-jpl/src/c/Makefile.am	(revision 27497)
+++ /issm/trunk-jpl/src/c/Makefile.am	(revision 27498)
@@ -601,4 +601,5 @@
 if FORTRAN
 issm_sources += ./modules/SurfaceMassBalancex/run_semic.f90
+issm_sources += ./modules/SurfaceMassBalancex/run_semic_transient.f90
 endif
 endif
Index: /issm/trunk-jpl/src/c/analyses/SmbAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/SmbAnalysis.cpp	(revision 27497)
+++ /issm/trunk-jpl/src/c/analyses/SmbAnalysis.cpp	(revision 27498)
@@ -206,5 +206,7 @@
 			break;
 		case SMBsemicEnum:
-			iomodel->FetchDataToInput(inputs,elements,"md.thermal.spctemperature",ThermalSpctemperatureEnum);
+			int ismethod;
+			//if(VerboseSolution()) _printf0_("   smb semic: UpdateElements.\n");
+			//iomodel->FetchDataToInput(inputs,elements,"md.thermal.spctemperature",ThermalSpctemperatureEnum);
 			iomodel->FetchDataToInput(inputs,elements,"md.smb.s0gcm",SmbS0gcmEnum);
 			iomodel->FetchDataToInput(inputs,elements,"md.smb.dailysnowfall",SmbDailysnowfallEnum);
@@ -217,4 +219,26 @@
 			iomodel->FetchDataToInput(inputs,elements,"md.smb.dailyairhumidity",SmbDailyairhumidityEnum);
 			iomodel->FetchDataToInput(inputs,elements,"md.smb.dailytemperature",SmbDailytemperatureEnum);
+			// assign initial SEMIC temperature from initialization class.
+			if(VerboseSolution()) _printf0_("   smb semic: UpdateElements - temperature.\n");
+			iomodel->FetchDataToInput(inputs,elements,"md.initialization.temperature",TemperatureSEMICEnum);
+
+			iomodel->FindConstant(&ismethod,"md.smb.ismethod");
+			if (ismethod == 1){
+				// initial albedo
+				if(VerboseSolution()) _printf0_("   smb semic: UpdateElements - albedo.\n");
+				iomodel->FetchDataToInput(inputs,elements,"md.smb.albedo",SmbAlbedoEnum);
+				iomodel->FetchDataToInput(inputs,elements,"md.smb.albedo_snow",SmbAlbedoSnowEnum);
+				if(VerboseSolution()) _printf0_("   smb semic: UpdateElements - Hice/Hsnow.\n");
+				iomodel->FetchDataToInput(inputs,elements,"md.smb.hice",SmbHIceEnum);
+				iomodel->FetchDataToInput(inputs,elements,"md.smb.hsnow",SmbHSnowEnum);
+
+				// initial Temperature amplitude.
+				if(VerboseSolution()) _printf0_("   smb semic: UpdateElements - Tamp.\n");
+				iomodel->FetchDataToInput(inputs,elements,"md.smb.Tamp",SmbTampEnum);
+
+				// assign masking 
+				iomodel->FetchDataToInput(inputs,elements,"md.smb.mask",SmbMaskEnum);
+				if(VerboseSolution()) _printf0_("   smb semic: UpdateElements - done.\n");
+			}
 			break;
 		case SMBdebrisMLEnum:
@@ -420,4 +444,17 @@
 			break;
 		case SMBsemicEnum:
+			int ismethod;
+			parameters->FindParam(&ismethod,SmbSemicMethodEnum);
+			if (ismethod == 1){
+				parameters->AddObject(iomodel->CopyConstantObject("md.smb.desfacElevation",SmbDesfacElevEnum));
+				parameters->AddObject(iomodel->CopyConstantObject("md.smb.hcrit",SmbSemicHcritEnum));
+				parameters->AddObject(iomodel->CopyConstantObject("md.smb.rcrit",SmbSemicRcritEnum));
+				/*Define albedo parameters.*/
+				parameters->AddObject(iomodel->CopyConstantObject("md.smb.albedo_scheme",SmbAlbedoSchemeEnum));
+				parameters->AddObject(iomodel->CopyConstantObject("md.smb.alb_smax",SmbAlbedoSnowMaxEnum));
+				parameters->AddObject(iomodel->CopyConstantObject("md.smb.alb_smin",SmbAlbedoSnowMinEnum));
+				parameters->AddObject(iomodel->CopyConstantObject("md.smb.albi",SmbAlbedoIceEnum));
+				parameters->AddObject(iomodel->CopyConstantObject("md.smb.albl",SmbAlbedoLandEnum));
+			}
 			/*Nothing to add to parameters*/
 			break;
@@ -514,6 +551,8 @@
 		case SMBsemicEnum:
 			#ifdef _HAVE_SEMIC_
-			if(VerboseSolution())_printf0_("  call smb SEMIC module\n");
-			SmbSemicx(femmodel);
+			if(VerboseSolution())_printf0_("   call smb SEMIC module\n");
+			int ismethod;
+			femmodel->parameters->FindParam(&ismethod,SmbSemicMethodEnum);
+			SmbSemicx(femmodel,ismethod);
 			#else
 			_error_("SEMIC not installed");
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 27497)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.cpp	(revision 27498)
@@ -30,4 +30,11 @@
 extern "C" void run_semic_(IssmDouble *sf_in, IssmDouble *rf_in, IssmDouble *swd_in, IssmDouble *lwd_in, IssmDouble *wind_in, IssmDouble *sp_in, IssmDouble *rhoa_in,
 			IssmDouble *qq_in, IssmDouble *tt_in, IssmDouble *tsurf_out, IssmDouble *smb_out, IssmDouble *saccu_out, IssmDouble *smelt_out);
+extern "C" void run_semic_transient_(IssmDouble *sf_in, IssmDouble *rf_in, IssmDouble *swd_in, IssmDouble *lwd_in, IssmDouble *wind_in, IssmDouble *sp_in, IssmDouble *rhoa_in,
+			IssmDouble *qq_in, IssmDouble *tt_in, IssmDouble *tsurf_in, IssmDouble *tstic,
+			IssmDouble *hcrit, IssmDouble *rcrit,
+			IssmDouble *mask, IssmDouble *hice, IssmDouble *hsnow,
+			IssmDouble *albedo, IssmDouble *albedo_snow, int *alb_scheme, IssmDouble *alb_smax, IssmDouble *alb_smin, IssmDouble *albi, IssmDouble *albl,
+			IssmDouble *Tamp, 
+			IssmDouble *tsurf_out, IssmDouble *smb_out, IssmDouble *saccu_out, IssmDouble *smelt_out, IssmDouble *albedo_out, IssmDouble *albedo_snow_out, IssmDouble *hsnow_out, IssmDouble *hice_out);
 #endif
 // _HAVE_SEMIC_
@@ -4208,4 +4215,226 @@
 	xDelete<IssmDouble>(saccu_out);
 	xDelete<IssmDouble>(tsurf_out);
+	xDelete<IssmDouble>(s);
+	xDelete<IssmDouble>(st);
+	xDelete<IssmDouble>(s0gcm);
+}
+/*}}}*/
+void       Element::SmbSemicTransient(){/*{{{*/
+
+	/*only compute SMB at the surface: */
+	if (!IsOnSurface()) return;
+
+	const int NUM_VERTICES 					= this->GetNumberOfVertices();
+	const int NLOOP = 10; // default internal iteration for SEMIC (Ruckamp et al. 2018).
+
+	IssmDouble* s=xNew<IssmDouble>(NUM_VERTICES);
+	IssmDouble* s0gcm=xNew<IssmDouble>(NUM_VERTICES);
+	IssmDouble* st=xNew<IssmDouble>(NUM_VERTICES);
+
+	// daily forcing inputs
+	IssmDouble* dailyrainfall   =xNew<IssmDouble>(NUM_VERTICES);
+	IssmDouble* dailysnowfall   =xNew<IssmDouble>(NUM_VERTICES);
+	IssmDouble* dailydlradiation=xNew<IssmDouble>(NUM_VERTICES);
+	IssmDouble* dailydsradiation=xNew<IssmDouble>(NUM_VERTICES);
+	IssmDouble* dailywindspeed  =xNew<IssmDouble>(NUM_VERTICES);
+	IssmDouble* dailypressure   =xNew<IssmDouble>(NUM_VERTICES);
+	IssmDouble* dailyairdensity =xNew<IssmDouble>(NUM_VERTICES);
+	IssmDouble* dailyairhumidity=xNew<IssmDouble>(NUM_VERTICES);
+	IssmDouble* dailytemperature=xNew<IssmDouble>(NUM_VERTICES);
+
+	IssmDouble* tsurf_in        =xNew<IssmDouble>(NUM_VERTICES); 
+	IssmDouble* mask_in         =xNew<IssmDouble>(NUM_VERTICES); 
+	IssmDouble* Tamp_in         =xNew<IssmDouble>(NUM_VERTICES); 
+	IssmDouble* albedo_in       =xNew<IssmDouble>(NUM_VERTICES); 
+	IssmDouble* albedo_snow_in  =xNew<IssmDouble>(NUM_VERTICES); 
+	IssmDouble* hice_in         =xNew<IssmDouble>(NUM_VERTICES); 
+	IssmDouble* hsnow_in        =xNew<IssmDouble>(NUM_VERTICES); 
+
+	// daily outputs
+	IssmDouble* tsurf_out  =xNew<IssmDouble>(NUM_VERTICES); memset(tsurf_out, 0., NUM_VERTICES*sizeof(IssmDouble));
+	IssmDouble* smb_out    =xNew<IssmDouble>(NUM_VERTICES); memset(smb_out, 0., NUM_VERTICES*sizeof(IssmDouble));
+	IssmDouble* saccu_out  =xNew<IssmDouble>(NUM_VERTICES); memset(saccu_out, 0., NUM_VERTICES*sizeof(IssmDouble));
+	IssmDouble* smelt_out  =xNew<IssmDouble>(NUM_VERTICES); memset(smelt_out, 0., NUM_VERTICES*sizeof(IssmDouble));
+	IssmDouble* albedo_out =xNew<IssmDouble>(NUM_VERTICES); memset(albedo_out, 0., NUM_VERTICES*sizeof(IssmDouble));
+	IssmDouble* albedo_snow_out =xNew<IssmDouble>(NUM_VERTICES); memset(albedo_snow_out, 0., NUM_VERTICES*sizeof(IssmDouble));
+	IssmDouble* hsnow_out    =xNew<IssmDouble>(NUM_VERTICES); memset(hsnow_out, 0., NUM_VERTICES*sizeof(IssmDouble));
+	IssmDouble* hice_out    =xNew<IssmDouble>(NUM_VERTICES); memset(hice_out, 0., NUM_VERTICES*sizeof(IssmDouble));
+
+	IssmDouble rho_water,rho_ice,desfac,desfacElev,rlaps,rdl;
+	IssmDouble alb_smax, alb_smin, albi, albl;
+	int alb_scheme;
+	IssmDouble hcrit, rcrit;
+
+	IssmDouble time,yts,time_yr,dt;
+
+	/* Get time: */
+	this->parameters->FindParam(&time,TimeEnum);
+	this->parameters->FindParam(&dt,TimesteppingTimeStepEnum);
+	this->parameters->FindParam(&yts,ConstantsYtsEnum);
+	time_yr=floor(time/yts)*yts;
+	//dt = dt * yts;
+
+	/*Get material parameters :*/
+	rho_water=this->FindParam(MaterialsRhoSeawaterEnum);
+	rho_ice=this->FindParam(MaterialsRhoIceEnum);
+	desfac=this->FindParam(SmbDesfacEnum);
+	desfacElev=this->FindParam(SmbDesfacElevEnum);
+	rlaps=this->FindParam(SmbRlapsEnum);
+	rdl=this->FindParam(SmbRdlEnum);
+
+	this->FindParam(&alb_scheme,SmbAlbedoSchemeEnum);
+	this->FindParam(&hcrit,SmbSemicHcritEnum);
+	this->FindParam(&rcrit,SmbSemicRcritEnum);
+	alb_smax=this->FindParam(SmbAlbedoSnowMaxEnum);
+	alb_smin=this->FindParam(SmbAlbedoSnowMinEnum);
+	albi=this->FindParam(SmbAlbedoIceEnum);
+	albl=this->FindParam(SmbAlbedoLandEnum);
+
+	/* Recover info at the vertices: */
+	GetInputListOnVertices(&s[0],SurfaceEnum);
+	GetInputListOnVertices(&s0gcm[0],SmbS0gcmEnum);
+
+	if(VerboseSmb() && this->Sid()==0){
+		_printf0_("smb core: allocate inputs.\n");
+		_printf0_("smb core: time_yr  : " << time_yr/yts <<"\n");
+		_printf0_("smb core: time     : " << time <<"\n");
+		_printf0_("smb core: dt       : " << dt <<"\n");
+	}
+	/* loop over vertices and days */ //FIXME account for leap years (365 -> 366)
+	Gauss* gauss=this->NewGauss();
+	/* Retrieve inputs: */
+	Input* dailysnowfall_input    = this->GetInput(SmbDailysnowfallEnum,time); _assert_(dailysnowfall_input);
+	Input* dailyrainfall_input    = this->GetInput(SmbDailyrainfallEnum,time); _assert_(dailyrainfall_input);
+	Input* dailydlradiation_input = this->GetInput(SmbDailydlradiationEnum,time); _assert_(dailydlradiation_input);
+	Input* dailydsradiation_input = this->GetInput(SmbDailydsradiationEnum,time); _assert_(dailydsradiation_input);
+	Input* dailywindspeed_input   = this->GetInput(SmbDailywindspeedEnum,time); _assert_(dailywindspeed_input);
+	Input* dailypressure_input    = this->GetInput(SmbDailypressureEnum,time); _assert_(dailypressure_input);
+	Input* dailyairdensity_input  = this->GetInput(SmbDailyairdensityEnum,time); _assert_(dailyairdensity_input);
+	Input* dailyairhumidity_input = this->GetInput(SmbDailyairhumidityEnum,time); _assert_(dailyairhumidity_input);
+	Input* dailytemperature_input = this->GetInput(SmbDailytemperatureEnum,time); _assert_(dailytemperature_input);
+
+	Input* tsurf_input            = this->GetInput(TemperatureSEMICEnum); _assert_(tsurf_in);
+	Input* mask_input        = this->GetInput(SmbMaskEnum); _assert_(mask_input);
+	Input* Tamp_input        = this->GetInput(SmbTampEnum); _assert_(Tamp_input);
+	Input* albedo_input      = this->GetInput(SmbAlbedoEnum); _assert_(albedo_input);
+	Input* albedo_snow_input = this->GetInput(SmbAlbedoSnowEnum); _assert_(albedo_snow_input);
+	Input* hice_input        = this->GetInput(SmbHIceEnum); _assert_(hice_input);
+	Input* hsnow_input       = this->GetInput(SmbHSnowEnum); _assert_(hsnow_input);
+
+	if(VerboseSmb() && this->Sid()==0)_printf0_("smb core: assign inputs.\n");
+	for(int iv=0;iv<NUM_VERTICES;iv++){
+		gauss->GaussVertex(iv);
+		/* get forcing */
+		dailyrainfall_input->GetInputValue(&dailyrainfall[iv],gauss);
+		dailysnowfall_input->GetInputValue(&dailysnowfall[iv],gauss);
+		dailydlradiation_input->GetInputValue(&dailydlradiation[iv],gauss);
+		dailydsradiation_input->GetInputValue(&dailydsradiation[iv],gauss);
+		dailywindspeed_input->GetInputValue(&dailywindspeed[iv],gauss);
+		dailypressure_input->GetInputValue(&dailypressure[iv],gauss);
+		dailyairdensity_input->GetInputValue(&dailyairdensity[iv],gauss);
+		dailyairhumidity_input->GetInputValue(&dailyairhumidity[iv],gauss);
+		dailytemperature_input->GetInputValue(&dailytemperature[iv],gauss);
+		tsurf_input->GetInputValue(&tsurf_in[iv],gauss);
+
+		/* Get Albedo information */
+		mask_input->GetInputValue(&mask_in[iv],gauss);
+		Tamp_input->GetInputValue(&Tamp_in[iv],gauss);
+		albedo_input->GetInputValue(&albedo_in[iv],gauss);
+		albedo_snow_input->GetInputValue(&albedo_snow_in[iv],gauss);
+
+		hsnow_input->GetInputValue(&hsnow_in[iv],gauss);
+		hice_input->GetInputValue(&hice_in[iv],gauss);
+
+		/* Surface temperature correction */
+		st[iv]=(s[iv]-s0gcm[iv])/1000.;
+		dailytemperature[iv]=dailytemperature[iv]-rlaps *st[iv];
+
+		/* Precipitation correction (Vizcaino et al. 2010) */
+		if (s0gcm[iv] < desfacElev) {
+			dailysnowfall[iv] = dailysnowfall[iv]*exp(desfac*(max(s[iv],desfacElev)-desfacElev));
+			dailyrainfall[iv] = dailyrainfall[iv]*exp(desfac*(max(s[iv],desfacElev)-desfacElev));
+		}else{
+			dailysnowfall[iv] = dailysnowfall[iv]*exp(desfac*(max(s[iv],desfacElev)-s0gcm[iv]));
+			dailyrainfall[iv] = dailyrainfall[iv]*exp(desfac*(max(s[iv],desfacElev)-s0gcm[iv]));
+		}
+
+		/* downward longwave radiation correction (Marty et al. 2002) */
+		st[iv]=(s[iv]-s0gcm[iv])/1000.;
+		dailydlradiation[iv]=dailydlradiation[iv]+rdl*st[iv];
+	}
+	if(VerboseSmb() && this->Sid()==0){
+		_printf0_("smb core: assign tsurf_in        :" << tsurf_in[0] << "\n");
+		_printf0_("smb core: assign dailytemperature:" << dailytemperature[0] << "\n");
+		_printf0_("smb core: assign hsnow           :" << hsnow_in[0] << "\n");
+		_printf0_("smb core: assign hice            :" << hice_in[0] << "\n");
+		_printf0_("smb core: assign mask            :" << mask_in[0] << "\n");
+		_printf0_("smb core: assign albedo          :" << albedo_in[0] << "\n");
+		_printf0_("smb core: assign albedo_snow     :" << albedo_snow_in[0] << "\n");
+	}
+
+	if(VerboseSmb() && this->Sid()==0)_printf0_("smb core: call semic module.\n");
+	for (int iv = 0; iv<NUM_VERTICES; iv++){
+		/* call semic */
+		run_semic_transient_(&dailysnowfall[iv], &dailyrainfall[iv], &dailydsradiation[iv], &dailydlradiation[iv],
+				&dailywindspeed[iv], &dailypressure[iv], &dailyairdensity[iv], &dailyairhumidity[iv], &dailytemperature[iv], &tsurf_in[iv], &dt,
+				&hcrit, &rcrit, 
+				&mask_in[iv], &hice_in[iv], &hsnow_in[iv], 
+				&albedo_in[iv], &albedo_snow_in[iv], &alb_scheme, &alb_smax, &alb_smin, &albi, &albl,
+				&Tamp_in[iv],
+				&tsurf_out[iv], &smb_out[iv], &saccu_out[iv], &smelt_out[iv],&albedo_out[iv], &albedo_snow_out[iv], &hsnow_out[iv], &hice_out[iv]);
+	}
+
+	if(VerboseSmb() && this->Sid()==0){
+		_printf0_("smb core: tsurf_out " << tsurf_out[0] << "\n");
+	}
+
+	switch(this->ObjectEnum()){
+		case TriaEnum:
+			//this->AddInput(TemperatureEnum,&tsurf_out[0],P1Enum); // TODO add TemperatureSEMICEnum to EnumDefinitions
+			this->AddInput(TemperatureSEMICEnum,&tsurf_out[0],P1Enum); // TODO add TemperatureSEMICEnum to EnumDefinitions
+			this->AddInput(SmbMassBalanceEnum,&smb_out[0],P1Enum);
+			this->AddInput(SmbAccumulationEnum,&saccu_out[0],P1Enum);
+			this->AddInput(SmbMeltEnum,&smelt_out[0],P1Enum);
+			this->AddInput(SmbAlbedoEnum,&albedo_out[0],P1Enum);
+			this->AddInput(SmbAlbedoSnowEnum,&albedo_snow_out[0],P1Enum);
+			this->AddInput(SmbHSnowEnum,&hsnow_out[0],P1Enum);
+			this->AddInput(SmbHIceEnum,&hice_out[0],P1Enum);
+			break;
+		case PentaEnum:
+			// TODO
+			break;
+		case TetraEnum:
+			// TODO
+			break;
+		default: _error_("Not implemented yet");
+	}
+
+	/*clean-up*/
+	delete gauss;
+	xDelete<IssmDouble>(dailysnowfall);
+	xDelete<IssmDouble>(dailyrainfall);
+	xDelete<IssmDouble>(dailydlradiation);
+	xDelete<IssmDouble>(dailydsradiation);
+	xDelete<IssmDouble>(dailywindspeed);
+	xDelete<IssmDouble>(dailypressure);
+	xDelete<IssmDouble>(dailyairdensity);
+	xDelete<IssmDouble>(dailyairhumidity);
+	xDelete<IssmDouble>(dailypressure);
+	xDelete<IssmDouble>(dailytemperature);
+
+	xDelete<IssmDouble>(tsurf_out);
+	xDelete<IssmDouble>(smb_out);
+	xDelete<IssmDouble>(saccu_out);
+	xDelete<IssmDouble>(smelt_out);
+	xDelete<IssmDouble>(albedo_out);
+	xDelete<IssmDouble>(albedo_snow_out);
+
+	xDelete<IssmDouble>(hsnow_in);
+	xDelete<IssmDouble>(hice_in);
+	xDelete<IssmDouble>(mask_in);
+	xDelete<IssmDouble>(Tamp_in);
+	xDelete<IssmDouble>(albedo_snow_in);
+	xDelete<IssmDouble>(albedo_in);
+	xDelete<IssmDouble>(tsurf_in);
 	xDelete<IssmDouble>(s);
 	xDelete<IssmDouble>(st);
Index: /issm/trunk-jpl/src/c/classes/Elements/Element.h
===================================================================
--- /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 27497)
+++ /issm/trunk-jpl/src/c/classes/Elements/Element.h	(revision 27498)
@@ -187,4 +187,5 @@
 		void               SetIntInput(Inputs* inputs,int enum_in,int value);
 		void               SmbSemic();
+		void               SmbSemicTransient();
 		int                Sid();
 		void               SmbGemb(IssmDouble timeinputs, int count);
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 27497)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 27498)
@@ -487,4 +487,5 @@
 			parameters->AddObject(iomodel->CopyConstantObject("md.smb.rlaps",SmbRlapsEnum));
 			parameters->AddObject(iomodel->CopyConstantObject("md.smb.rdl",SmbRdlEnum));
+			parameters->AddObject(iomodel->CopyConstantObject("md.smb.ismethod",SmbSemicMethodEnum));
 			break;
 		case SMBdebrisMLEnum:
Index: /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 27497)
+++ /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.cpp	(revision 27498)
@@ -655,9 +655,10 @@
 }/*}}}*/
 #ifdef _HAVE_SEMIC_
-void SmbSemicx(FemModel* femmodel){/*{{{*/
-
-	for(Object* & object : femmodel->elements->objects){
-		Element* element=xDynamicCast<Element*>(object);
-		element->SmbSemic();
+void SmbSemicx(FemModel* femmodel,int ismethod){/*{{{*/
+
+	for(Object* & object : femmodel->elements->objects){
+		Element* element=xDynamicCast<Element*>(object);
+		if (ismethod == 1) element->SmbSemicTransient(); // Inwoo's version.
+		else element->SmbSemic(); // original SmbSEMIC
 	}
 
Index: /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h	(revision 27497)
+++ /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/SurfaceMassBalancex.h	(revision 27498)
@@ -25,5 +25,5 @@
 void SmbDebrisMLx(FemModel* femmodel);
 /* SEMIC: */
-void SmbSemicx(FemModel* femmodel);
+void SmbSemicx(FemModel* femmodel, int ismethod);
 /*GEMB: */
 void       Gembx(FemModel* femmodel);
Index: /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/run_semic_transient.f90
===================================================================
--- /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/run_semic_transient.f90	(revision 27498)
+++ /issm/trunk-jpl/src/c/modules/SurfaceMassBalancex/run_semic_transient.f90	(revision 27498)
@@ -0,0 +1,211 @@
+subroutine run_semic_transient(sf_in, rf_in, swd_in, lwd_in, wind_in, &
+      sp_in, rhoa_in, qq_in, tt_in, tsurf_in, tstic, &
+      hcrit, rcrit, &
+      mask, hice, hsnow, &
+      albedo, albedo_snow, alb_scheme, alb_smax, alb_smin, albi, albl, &
+      Tamp, &
+      tsurf_out, smb_out, saccu_out, smelt_out, alb_out, alb_snow_out,hsnow_out,hice_out)
+
+   use utils
+   use surface_physics
+
+   implicit none
+
+   ! declare surface physics class
+   type(surface_physics_class) :: surface
+   ! declare forcing class
+   type(forc_class) :: forc
+   ! declare validation class
+   !type(vali_class) :: vali	! validation not needed here
+
+   integer, parameter:: dp=kind(0.d0)  !< define precision (machine specific)
+   integer :: i, k, nx, nloop, ntime, year
+   integer :: day=1 !< not used value.
+
+   ! forcing data    
+   double precision, intent(in) :: sf_in  ! snow fall rate [m/s]
+   double precision, intent(in) :: rf_in  ! rain fall rate [m/s]
+   double precision, intent(in) :: swd_in ! downwelling shortwave radiation [W/m2]
+   double precision, intent(in) :: lwd_in ! downwelling longwave radiation [W/m2]
+   double precision, intent(in) :: wind_in! surface wind speed [m/s]
+   double precision, intent(in) :: sp_in  ! surface pressure [Pa]
+   double precision, intent(in) :: rhoa_in! air density [kg/m3]
+   double precision, intent(in) :: qq_in  ! air specific humidity [kg/kg]
+   double precision, intent(in) :: tt_in  ! air temperature [K]
+
+   ! input data
+   double precision, intent(in) :: tstic  ! time step from ISSM [sec].
+   double precision, intent(in) :: tsurf_in ! input temperature [K]
+
+   ! output data
+   double precision :: tsurf_out  ! Ice surface Temperature [K]
+   double precision :: smb_out    ! surface mass balance=(Accu-Melt) [m/s]
+   double precision :: saccu_out  ! accumulation [m/s]
+   double precision :: smelt_out  ! ablation [m/s]
+   double precision :: alb_out    ! grid-averaged albedo [no unit] 
+   double precision :: alb_snow_out  
+   double precision :: qmr_out    
+   double precision :: hice_out    
+   double precision :: hsnow_out 
+
+   double precision :: total_time, start, finish
+
+   ! set parameters
+   character (len=256) :: name         ! not used(?)
+   character (len=256) :: boundary(30) ! not used(?)
+   !character (len=256), intent(in) :: alb_scheme  !< name of albedo scheme
+   integer, intent(in)          :: alb_scheme
+   integer :: n_ksub    
+   double precision             :: ceff         !< surface heat heat capacity of snow/ice [J/W m2]
+   double precision, intent(in) :: hsnow
+   double precision, intent(in) :: hice
+   double precision, intent(in) :: albi
+   double precision, intent(in) :: albl
+   double precision, intent(in) :: mask
+   double precision, intent(in) :: albedo  
+   double precision, intent(in) :: albedo_snow 
+   double precision, intent(in) :: alb_smax
+   double precision, intent(in) :: alb_smin
+   double precision, intent(in) :: hcrit !< critical snow height for which grid cell is 50% snow covered [m]
+   double precision, intent(in) :: rcrit !< critical snow height fro which refreezing fraction is 50% [m]
+   double precision, intent(in) :: Tamp
+   double precision    :: csh
+   double precision    :: clh
+   double precision    :: tmin
+   double precision    :: tmax
+   double precision    :: tsticsub
+   ! parameters for isba albedo scheme.
+   double precision    :: tau_a  !< critical liquide water concent for "isba" albedo scheme [kg/m2]
+   double precision    :: tau_f
+   double precision    :: w_crit
+   double precision    :: mcrit
+   double precision    :: afac !< param
+   double precision    :: tmid !< param for "alex" albedo parameterization [K]
+
+   nx = 1
+   ntime = 365
+   year = 0
+
+   ! set vector length
+   surface%par%nx = nx
+
+   ! set input (forcing data)
+   !forc%sf(:,:) = sf_in      ! snowfall flux [m/sec]
+   !forc%rf(:,:) = rf_in      ! rainfall flux [m/sec]
+   !forc%swd(:,:) = swd_in    ! short radiation
+   !forc%lwd(:,:) = lwd_in    ! long radiation downward
+   !forc%wind(:,:) = wind_ina ! wind speed.
+   !forc%sp(:,:) = sp_in      ! surface pressure
+   !forc%rhoa(:,:) = rhoa_in  ! air density [kg/m3]
+   !forc%qq(:,:) = qq_in      ! air specific humidity [kg/kg]
+   !forc%tt(:,:) = tt_in      ! 2m air temperature 
+
+   ! FIXME should be user input
+   !boundary = "" "" ""
+   !surface%par%tstic = 86400.0_dp !< time step [s] in one day.
+   surface%par%tstic = tstic      !< time step [s]
+   surface%par%ceff= 2.0e6_dp     !< surface heat capacity of snow/ice [J/K/m2]
+   surface%par%csh = 2.0e-3_dp
+   surface%par%clh = 5.0e-4_dp    !< latent heat exchange coefficient [no unit]
+   surface%par%alb_smax = alb_smax !0.79_dp !< max snow albedo
+   surface%par%alb_smin = alb_smin !0.6_dp  !< min snow albedo
+   surface%par%albi = albi !0.41_dp     !< albedo for ice
+   surface%par%albl = albl !0.07_dp     !< albedo for land
+   surface%par%tmin = -999_dp
+   surface%par%tmax = 273.15_dp
+   surface%par%hcrit = hcrit !0.028_dp   !< critical snow height for which grid cell is 50 % snow colvered [m]
+   surface%par%rcrit = rcrit !0.85_dp    !< refreezing fraction is 50% [m]
+   surface%par%amp   = Tamp !3.0_dp   !< amplitude of diurnal cycle [K]
+   if (alb_scheme == 0) then
+      surface%par%alb_scheme="None"
+   else if (alb_scheme == 1) then
+      surface%par%alb_scheme = "slater"
+   else if (alb_scheme == 2) then
+      surface%par%alb_scheme = "denby"
+   else if (alb_scheme == 3) then
+      surface%par%alb_scheme = "isba"
+   end if 
+   surface%par%tau_a = 0.008_dp
+   surface%par%tau_f = 0.24_dp
+   surface%par%w_crit = 15.0_dp
+   surface%par%mcrit = 6.0e-8_dp
+   surface%par%n_ksub = 3.0_dp
+   
+   ! initialize sub-daily time step tsticsub
+   surface%par%tsticsub = surface%par%tstic / dble(surface%par%n_ksub)
+
+   ! allocate necessary arrays for surface_physics module
+   call surface_alloc(surface%now,surface%par%nx)
+
+   ! initialise prognostic variables
+   ! these values will be updated through "surface_energy_and_mass_balance" function.
+   surface%now%mask(:)     = mask   ! 2.0_dp  !loi_mask(:nx)
+   surface%now%hsnow(:)    = hsnow  ! 1.0_dp !< snow height...
+   surface%now%hice(:)     = hice   ! 0.0_dp !< ice thickness...
+   surface%now%tsurf(:)    = tsurf_in
+   surface%now%alb(:)      = albedo ! 0.8_dp   !< initial albedo
+   surface%now%alb_snow(:) = albedo_snow ! 0.8_dp
+   !surface%now%acc(:)   = 0.0_dp
+   !surface%now%smb(:)   = 0.0_dp
+   !surface%now%melt(:)  = 0.0_dp
+   surface%now%qmr_res(:) = 0.0_dp
+
+   ! initialize with zeros
+   surface%now%qmr(:) = 0.0_dp
+
+   tsurf_out = 0.0_dp
+   smb_out = 0.0_dp
+   saccu_out = 0.0_dp
+   smelt_out = 0.0_dp
+   alb_out = 0.0_dp
+
+   ! define boundary conditions (not used, here!)
+   call surface_boundary_define(surface%bnd,surface%par%boundary)
+   !call print_boundary_opt(surface%bnd)
+
+
+   !surface%now%sf = forc%sf(1,day)
+   !surface%now%rf = forc%rf(1,day)
+   !surface%now%sp = forc%sp(1,day)
+   !surface%now%lwd = forc%lwd(1,day)
+   !surface%now%swd = forc%swd(1,day)
+   !surface%now%wind = forc%wind(1,day)
+   !surface%now%rhoa = forc%rhoa(1,day)
+   !surface%now%t2m = forc%tt(1,day)
+   !surface%now%qq = forc%qq(1,day)
+   
+   ! input with single value
+   surface%now%sf   = sf_in
+   surface%now%rf   = rf_in
+   surface%now%sp   = sp_in
+   surface%now%lwd  = lwd_in
+   surface%now%swd  = swd_in
+   surface%now%wind = wind_in
+   surface%now%rhoa = rhoa_in
+   surface%now%t2m  = tt_in
+   surface%now%qq   = qq_in
+
+   ! calculate prognostic and diagnsotic variables
+   call cpu_time(start)
+   call surface_energy_and_mass_balance(surface%now,surface%par,surface%bnd,day,-1)
+   call cpu_time(finish)
+   total_time = total_time + (finish - start)
+
+   tsurf_out=surface%now%tsurf(1)
+   ! melt - potential surface melt [m/s]
+   ! smb
+   smb_out   =surface%now%smb(1) !*1.0_dp/365.0_dp
+   saccu_out =surface%now%acc(1) !*1.0_dp/365.0_dp
+   smelt_out =surface%now%melt(1)!*1.0_dp/365.0_dp
+   alb_out   =surface%now%alb(1)
+   alb_snow_out  =surface%now%alb_snow(1)
+   qmr_out    =surface%now%qmr(1)
+   hsnow_out  =surface%now%hsnow(1)
+   hice_out   =surface%now%hice(1)
+
+   ! de-allocate surface_physics arrays
+   call surface_dealloc(surface%now)
+
+   !write(*,*) 'total time for surface_physics:', nloop, total_time
+
+end subroutine run_semic_transient
Index: /issm/trunk-jpl/src/c/shared/Enum/Enum.vim
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 27497)
+++ /issm/trunk-jpl/src/c/shared/Enum/Enum.vim	(revision 27498)
@@ -524,4 +524,9 @@
 syn keyword cConstant SmbAccurefEnum
 syn keyword cConstant SmbAdThreshEnum
+syn keyword cConstant SmbAlbedoSchemeEnum
+syn keyword cConstant SmbAlbedoSnowMaxEnum
+syn keyword cConstant SmbAlbedoSnowMinEnum
+syn keyword cConstant SmbAlbedoIceEnum
+syn keyword cConstant SmbAlbedoLandEnum
 syn keyword cConstant SmbARMATimestepEnum
 syn keyword cConstant SmbARMAarOrderEnum
@@ -529,4 +534,5 @@
 syn keyword cConstant SmbAveragingEnum
 syn keyword cConstant SmbDesfacEnum
+syn keyword cConstant SmbDesfacElevEnum
 syn keyword cConstant SmbDpermilEnum
 syn keyword cConstant SmbDsnowIdxEnum
@@ -579,4 +585,7 @@
 syn keyword cConstant SmbRunoffrefEnum
 syn keyword cConstant SmbSealevEnum
+syn keyword cConstant SmbSemicMethodEnum
+syn keyword cConstant SmbSemicHcritEnum
+syn keyword cConstant SmbSemicRcritEnum
 syn keyword cConstant SmbStepsPerStepEnum
 syn keyword cConstant SmbSwIdxEnum
@@ -1010,4 +1019,6 @@
 syn keyword cConstant SmbAccumulatedRefreezeEnum
 syn keyword cConstant SmbAccumulatedRunoffEnum
+syn keyword cConstant SmbAlbedoEnum
+syn keyword cConstant SmbAlbedoSnowEnum
 syn keyword cConstant SmbAEnum
 syn keyword cConstant SmbAdiffEnum
@@ -1057,4 +1068,6 @@
 syn keyword cConstant SmbGspEnum
 syn keyword cConstant SmbGspiniEnum
+syn keyword cConstant SmbHIceEnum
+syn keyword cConstant SmbHSnowEnum
 syn keyword cConstant SmbHrefEnum
 syn keyword cConstant SmbIsInitializedEnum
@@ -1063,4 +1076,5 @@
 syn keyword cConstant SmbMassBalanceSubstepEnum
 syn keyword cConstant SmbMassBalanceTransientEnum
+syn keyword cConstant SmbMaskEnum
 syn keyword cConstant SmbMeanLHFEnum
 syn keyword cConstant SmbMeanSHFEnum
@@ -1096,4 +1110,5 @@
 syn keyword cConstant SmbTEnum
 syn keyword cConstant SmbTaEnum
+syn keyword cConstant SmbTampEnum
 syn keyword cConstant SmbTeValueEnum
 syn keyword cConstant SmbTemperaturesAnomalyEnum
@@ -1726,5 +1741,4 @@
 syn keyword cType Cfsurfacesquare
 syn keyword cType Channel
-syn keyword cType classes
 syn keyword cType Constraint
 syn keyword cType Constraints
@@ -1733,6 +1747,6 @@
 syn keyword cType ControlInput
 syn keyword cType Covertree
+syn keyword cType DataSetParam
 syn keyword cType DatasetInput
-syn keyword cType DataSetParam
 syn keyword cType Definition
 syn keyword cType DependentObject
@@ -1747,6 +1761,6 @@
 syn keyword cType ElementInput
 syn keyword cType ElementMatrix
+syn keyword cType ElementVector
 syn keyword cType Elements
-syn keyword cType ElementVector
 syn keyword cType ExponentialVariogram
 syn keyword cType ExternalResult
@@ -1755,10 +1769,9 @@
 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
@@ -1777,5 +1790,4 @@
 syn keyword cType IssmDirectApplicInterface
 syn keyword cType IssmParallelDirectApplicInterface
-syn keyword cType krigingobjects
 syn keyword cType Load
 syn keyword cType Loads
@@ -1788,5 +1800,4 @@
 syn keyword cType Matice
 syn keyword cType Matlitho
-syn keyword cType matrixobjects
 syn keyword cType MatrixParam
 syn keyword cType Misfit
@@ -1801,6 +1812,6 @@
 syn keyword cType Observations
 syn keyword cType Option
+syn keyword cType OptionUtilities
 syn keyword cType Options
-syn keyword cType OptionUtilities
 syn keyword cType Param
 syn keyword cType Parameters
@@ -1816,11 +1827,11 @@
 syn keyword cType Regionaloutput
 syn keyword cType Results
+syn keyword cType RiftStruct
 syn keyword cType Riftfront
-syn keyword cType RiftStruct
 syn keyword cType SealevelGeometry
 syn keyword cType Seg
 syn keyword cType SegInput
+syn keyword cType SegRef
 syn keyword cType Segment
-syn keyword cType SegRef
 syn keyword cType SpcDynamic
 syn keyword cType SpcStatic
@@ -1841,4 +1852,8 @@
 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 27497)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 27498)
@@ -518,4 +518,9 @@
 	SmbAccurefEnum,
 	SmbAdThreshEnum,
+	SmbAlbedoSchemeEnum,
+	SmbAlbedoSnowMaxEnum,
+	SmbAlbedoSnowMinEnum,
+	SmbAlbedoIceEnum,
+	SmbAlbedoLandEnum,
 	SmbARMATimestepEnum,
    SmbARMAarOrderEnum,
@@ -523,4 +528,5 @@
 	SmbAveragingEnum,
 	SmbDesfacEnum,
+	SmbDesfacElevEnum,
 	SmbDpermilEnum,
 	SmbDsnowIdxEnum,
@@ -573,4 +579,7 @@
 	SmbRunoffrefEnum,
 	SmbSealevEnum,
+	SmbSemicMethodEnum,
+	SmbSemicHcritEnum,
+	SmbSemicRcritEnum,
 	SmbStepsPerStepEnum,
 	SmbSwIdxEnum,
@@ -1006,4 +1015,6 @@
 	SmbAccumulatedRefreezeEnum,
 	SmbAccumulatedRunoffEnum,
+	SmbAlbedoEnum,
+	SmbAlbedoSnowEnum,
 	SmbAEnum,
 	SmbAdiffEnum,
@@ -1053,4 +1064,6 @@
 	SmbGspEnum,
 	SmbGspiniEnum,
+	SmbHIceEnum,
+	SmbHSnowEnum,
 	SmbHrefEnum,
 	SmbIsInitializedEnum,
@@ -1059,4 +1072,5 @@
    SmbMassBalanceSubstepEnum,
    SmbMassBalanceTransientEnum,
+	SmbMaskEnum,
 	SmbMeanLHFEnum,
 	SmbMeanSHFEnum,
@@ -1093,4 +1107,5 @@
 	SmbTEnum,
 	SmbTaEnum,
+	SmbTampEnum,
 	SmbTeValueEnum,
 	SmbTemperaturesAnomalyEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 27497)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 27498)
@@ -526,4 +526,9 @@
 		case SmbAccurefEnum : return "SmbAccuref";
 		case SmbAdThreshEnum : return "SmbAdThresh";
+		case SmbAlbedoSchemeEnum : return "SmbAlbedoScheme";
+		case SmbAlbedoSnowMaxEnum : return "SmbAlbedoSnowMax";
+		case SmbAlbedoSnowMinEnum : return "SmbAlbedoSnowMin";
+		case SmbAlbedoIceEnum : return "SmbAlbedoIce";
+		case SmbAlbedoLandEnum : return "SmbAlbedoLand";
 		case SmbARMATimestepEnum : return "SmbARMATimestep";
 		case SmbARMAarOrderEnum : return "SmbARMAarOrder";
@@ -531,4 +536,5 @@
 		case SmbAveragingEnum : return "SmbAveraging";
 		case SmbDesfacEnum : return "SmbDesfac";
+		case SmbDesfacElevEnum : return "SmbDesfacElev";
 		case SmbDpermilEnum : return "SmbDpermil";
 		case SmbDsnowIdxEnum : return "SmbDsnowIdx";
@@ -581,4 +587,7 @@
 		case SmbRunoffrefEnum : return "SmbRunoffref";
 		case SmbSealevEnum : return "SmbSealev";
+		case SmbSemicMethodEnum : return "SmbSemicMethod";
+		case SmbSemicHcritEnum : return "SmbSemicHcrit";
+		case SmbSemicRcritEnum : return "SmbSemicRcrit";
 		case SmbStepsPerStepEnum : return "SmbStepsPerStep";
 		case SmbSwIdxEnum : return "SmbSwIdx";
@@ -1012,4 +1021,6 @@
 		case SmbAccumulatedRefreezeEnum : return "SmbAccumulatedRefreeze";
 		case SmbAccumulatedRunoffEnum : return "SmbAccumulatedRunoff";
+		case SmbAlbedoEnum : return "SmbAlbedo";
+		case SmbAlbedoSnowEnum : return "SmbAlbedoSnow";
 		case SmbAEnum : return "SmbA";
 		case SmbAdiffEnum : return "SmbAdiff";
@@ -1059,4 +1070,6 @@
 		case SmbGspEnum : return "SmbGsp";
 		case SmbGspiniEnum : return "SmbGspini";
+		case SmbHIceEnum : return "SmbHIce";
+		case SmbHSnowEnum : return "SmbHSnow";
 		case SmbHrefEnum : return "SmbHref";
 		case SmbIsInitializedEnum : return "SmbIsInitialized";
@@ -1065,4 +1078,5 @@
 		case SmbMassBalanceSubstepEnum : return "SmbMassBalanceSubstep";
 		case SmbMassBalanceTransientEnum : return "SmbMassBalanceTransient";
+		case SmbMaskEnum : return "SmbMask";
 		case SmbMeanLHFEnum : return "SmbMeanLHF";
 		case SmbMeanSHFEnum : return "SmbMeanSHF";
@@ -1098,4 +1112,5 @@
 		case SmbTEnum : return "SmbT";
 		case SmbTaEnum : return "SmbTa";
+		case SmbTampEnum : return "SmbTamp";
 		case SmbTeValueEnum : return "SmbTeValue";
 		case SmbTemperaturesAnomalyEnum : return "SmbTemperaturesAnomaly";
Index: /issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim	(revision 27497)
+++ /issm/trunk-jpl/src/c/shared/Enum/Enumjl.vim	(revision 27498)
@@ -517,4 +517,9 @@
 syn keyword juliaConstC SmbAccurefEnum
 syn keyword juliaConstC SmbAdThreshEnum
+syn keyword juliaConstC SmbAlbedoSchemeEnum
+syn keyword juliaConstC SmbAlbedoSnowMaxEnum
+syn keyword juliaConstC SmbAlbedoSnowMinEnum
+syn keyword juliaConstC SmbAlbedoIceEnum
+syn keyword juliaConstC SmbAlbedoLandEnum
 syn keyword juliaConstC SmbARMATimestepEnum
 syn keyword juliaConstC SmbARMAarOrderEnum
@@ -522,4 +527,5 @@
 syn keyword juliaConstC SmbAveragingEnum
 syn keyword juliaConstC SmbDesfacEnum
+syn keyword juliaConstC SmbDesfacElevEnum
 syn keyword juliaConstC SmbDpermilEnum
 syn keyword juliaConstC SmbDsnowIdxEnum
@@ -572,4 +578,7 @@
 syn keyword juliaConstC SmbRunoffrefEnum
 syn keyword juliaConstC SmbSealevEnum
+syn keyword juliaConstC SmbSemicMethodEnum
+syn keyword juliaConstC SmbSemicHcritEnum
+syn keyword juliaConstC SmbSemicRcritEnum
 syn keyword juliaConstC SmbStepsPerStepEnum
 syn keyword juliaConstC SmbSwIdxEnum
@@ -1003,4 +1012,6 @@
 syn keyword juliaConstC SmbAccumulatedRefreezeEnum
 syn keyword juliaConstC SmbAccumulatedRunoffEnum
+syn keyword juliaConstC SmbAlbedoEnum
+syn keyword juliaConstC SmbAlbedoSnowEnum
 syn keyword juliaConstC SmbAEnum
 syn keyword juliaConstC SmbAdiffEnum
@@ -1050,4 +1061,6 @@
 syn keyword juliaConstC SmbGspEnum
 syn keyword juliaConstC SmbGspiniEnum
+syn keyword juliaConstC SmbHIceEnum
+syn keyword juliaConstC SmbHSnowEnum
 syn keyword juliaConstC SmbHrefEnum
 syn keyword juliaConstC SmbIsInitializedEnum
@@ -1056,4 +1069,5 @@
 syn keyword juliaConstC SmbMassBalanceSubstepEnum
 syn keyword juliaConstC SmbMassBalanceTransientEnum
+syn keyword juliaConstC SmbMaskEnum
 syn keyword juliaConstC SmbMeanLHFEnum
 syn keyword juliaConstC SmbMeanSHFEnum
@@ -1089,4 +1103,5 @@
 syn keyword juliaConstC SmbTEnum
 syn keyword juliaConstC SmbTaEnum
+syn keyword juliaConstC SmbTampEnum
 syn keyword juliaConstC SmbTeValueEnum
 syn keyword juliaConstC SmbTemperaturesAnomalyEnum
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 27497)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 27498)
@@ -538,4 +538,9 @@
 	      else if (strcmp(name,"SmbAccuref")==0) return SmbAccurefEnum;
 	      else if (strcmp(name,"SmbAdThresh")==0) return SmbAdThreshEnum;
+	      else if (strcmp(name,"SmbAlbedoScheme")==0) return SmbAlbedoSchemeEnum;
+	      else if (strcmp(name,"SmbAlbedoSnowMax")==0) return SmbAlbedoSnowMaxEnum;
+	      else if (strcmp(name,"SmbAlbedoSnowMin")==0) return SmbAlbedoSnowMinEnum;
+	      else if (strcmp(name,"SmbAlbedoIce")==0) return SmbAlbedoIceEnum;
+	      else if (strcmp(name,"SmbAlbedoLand")==0) return SmbAlbedoLandEnum;
 	      else if (strcmp(name,"SmbARMATimestep")==0) return SmbARMATimestepEnum;
 	      else if (strcmp(name,"SmbARMAarOrder")==0) return SmbARMAarOrderEnum;
@@ -543,4 +548,5 @@
 	      else if (strcmp(name,"SmbAveraging")==0) return SmbAveragingEnum;
 	      else if (strcmp(name,"SmbDesfac")==0) return SmbDesfacEnum;
+	      else if (strcmp(name,"SmbDesfacElev")==0) return SmbDesfacElevEnum;
 	      else if (strcmp(name,"SmbDpermil")==0) return SmbDpermilEnum;
 	      else if (strcmp(name,"SmbDsnowIdx")==0) return SmbDsnowIdxEnum;
@@ -593,4 +599,7 @@
 	      else if (strcmp(name,"SmbRunoffref")==0) return SmbRunoffrefEnum;
 	      else if (strcmp(name,"SmbSealev")==0) return SmbSealevEnum;
+	      else if (strcmp(name,"SmbSemicMethod")==0) return SmbSemicMethodEnum;
+	      else if (strcmp(name,"SmbSemicHcrit")==0) return SmbSemicHcritEnum;
+	      else if (strcmp(name,"SmbSemicRcrit")==0) return SmbSemicRcritEnum;
 	      else if (strcmp(name,"SmbStepsPerStep")==0) return SmbStepsPerStepEnum;
 	      else if (strcmp(name,"SmbSwIdx")==0) return SmbSwIdxEnum;
@@ -620,5 +629,8 @@
 	      else if (strcmp(name,"StressbalanceRequestedOutputs")==0) return StressbalanceRequestedOutputsEnum;
 	      else if (strcmp(name,"StressbalanceRestol")==0) return StressbalanceRestolEnum;
-	      else if (strcmp(name,"StressbalanceRiftPenaltyThreshold")==0) return StressbalanceRiftPenaltyThresholdEnum;
+         else stage=6;
+   }
+   if(stage==6){
+	      if (strcmp(name,"StressbalanceRiftPenaltyThreshold")==0) return StressbalanceRiftPenaltyThresholdEnum;
 	      else if (strcmp(name,"StressbalanceShelfDampening")==0) return StressbalanceShelfDampeningEnum;
 	      else if (strcmp(name,"ThermalForcingMonthlyEffects")==0) return ThermalForcingMonthlyEffectsEnum;
@@ -629,8 +641,5 @@
 	      else if (strcmp(name,"ThermalNumRequestedOutputs")==0) return ThermalNumRequestedOutputsEnum;
 	      else if (strcmp(name,"ThermalPenaltyFactor")==0) return ThermalPenaltyFactorEnum;
-         else stage=6;
-   }
-   if(stage==6){
-	      if (strcmp(name,"ThermalPenaltyLock")==0) return ThermalPenaltyLockEnum;
+	      else if (strcmp(name,"ThermalPenaltyLock")==0) return ThermalPenaltyLockEnum;
 	      else if (strcmp(name,"ThermalPenaltyThreshold")==0) return ThermalPenaltyThresholdEnum;
 	      else if (strcmp(name,"ThermalReltol")==0) return ThermalReltolEnum;
@@ -743,5 +752,8 @@
 	      else if (strcmp(name,"Bed")==0) return BedEnum;
 	      else if (strcmp(name,"BedGRD")==0) return BedGRDEnum;
-	      else if (strcmp(name,"BedEast")==0) return BedEastEnum;
+         else stage=7;
+   }
+   if(stage==7){
+	      if (strcmp(name,"BedEast")==0) return BedEastEnum;
 	      else if (strcmp(name,"BedEastGRD")==0) return BedEastGRDEnum;
 	      else if (strcmp(name,"BedNorth")==0) return BedNorthEnum;
@@ -752,8 +764,5 @@
 	      else if (strcmp(name,"BottomPressureOld")==0) return BottomPressureOldEnum;
 	      else if (strcmp(name,"CalvingCalvingrate")==0) return CalvingCalvingrateEnum;
-         else stage=7;
-   }
-   if(stage==7){
-	      if (strcmp(name,"CalvingHabFraction")==0) return CalvingHabFractionEnum;
+	      else if (strcmp(name,"CalvingHabFraction")==0) return CalvingHabFractionEnum;
 	      else if (strcmp(name,"CalvingAblationrate")==0) return CalvingAblationrateEnum;
 	      else if (strcmp(name,"CalvingMeltingrate")==0) return CalvingMeltingrateEnum;
@@ -866,5 +875,8 @@
 	      else if (strcmp(name,"HydrologydcMaskThawedElt")==0) return HydrologydcMaskThawedEltEnum;
 	      else if (strcmp(name,"HydrologydcMaskThawedNode")==0) return HydrologydcMaskThawedNodeEnum;
-	      else if (strcmp(name,"HydrologydcSedimentTransmitivity")==0) return HydrologydcSedimentTransmitivityEnum;
+         else stage=8;
+   }
+   if(stage==8){
+	      if (strcmp(name,"HydrologydcSedimentTransmitivity")==0) return HydrologydcSedimentTransmitivityEnum;
 	      else if (strcmp(name,"HydrologyDrainageRate")==0) return HydrologyDrainageRateEnum;
 	      else if (strcmp(name,"HydrologyEnglacialInput")==0) return HydrologyEnglacialInputEnum;
@@ -875,8 +887,5 @@
 	      else if (strcmp(name,"HydrologyGapHeightYY")==0) return HydrologyGapHeightYYEnum;
 	      else if (strcmp(name,"HydrologyHead")==0) return HydrologyHeadEnum;
-         else stage=8;
-   }
-   if(stage==8){
-	      if (strcmp(name,"HydrologyHeadOld")==0) return HydrologyHeadOldEnum;
+	      else if (strcmp(name,"HydrologyHeadOld")==0) return HydrologyHeadOldEnum;
 	      else if (strcmp(name,"HydrologyMoulinInput")==0) return HydrologyMoulinInputEnum;
 	      else if (strcmp(name,"HydrologyNeumannflux")==0) return HydrologyNeumannfluxEnum;
@@ -989,5 +998,8 @@
 	      else if (strcmp(name,"BslcHydro")==0) return BslcHydroEnum;
 	      else if (strcmp(name,"BslcOcean")==0) return BslcOceanEnum;
-	      else if (strcmp(name,"BslcRate")==0) return BslcRateEnum;
+         else stage=9;
+   }
+   if(stage==9){
+	      if (strcmp(name,"BslcRate")==0) return BslcRateEnum;
 	      else if (strcmp(name,"Gmtslc")==0) return GmtslcEnum;
 	      else if (strcmp(name,"SealevelRSLBarystatic")==0) return SealevelRSLBarystaticEnum;
@@ -998,8 +1010,5 @@
 	      else if (strcmp(name,"SealevelUNorthEsa")==0) return SealevelUNorthEsaEnum;
 	      else if (strcmp(name,"SealevelchangeIndices")==0) return SealevelchangeIndicesEnum;
-         else stage=9;
-   }
-   if(stage==9){
-	      if (strcmp(name,"SealevelchangeConvolutionVertices")==0) return SealevelchangeConvolutionVerticesEnum;
+	      else if (strcmp(name,"SealevelchangeConvolutionVertices")==0) return SealevelchangeConvolutionVerticesEnum;
 	      else if (strcmp(name,"SealevelchangeAlphaIndex")==0) return SealevelchangeAlphaIndexEnum;
 	      else if (strcmp(name,"SealevelchangeAzimuthIndex")==0) return SealevelchangeAzimuthIndexEnum;
@@ -1036,4 +1045,6 @@
 	      else if (strcmp(name,"SmbAccumulatedRefreeze")==0) return SmbAccumulatedRefreezeEnum;
 	      else if (strcmp(name,"SmbAccumulatedRunoff")==0) return SmbAccumulatedRunoffEnum;
+	      else if (strcmp(name,"SmbAlbedo")==0) return SmbAlbedoEnum;
+	      else if (strcmp(name,"SmbAlbedoSnow")==0) return SmbAlbedoSnowEnum;
 	      else if (strcmp(name,"SmbA")==0) return SmbAEnum;
 	      else if (strcmp(name,"SmbAdiff")==0) return SmbAdiffEnum;
@@ -1083,4 +1094,6 @@
 	      else if (strcmp(name,"SmbGsp")==0) return SmbGspEnum;
 	      else if (strcmp(name,"SmbGspini")==0) return SmbGspiniEnum;
+	      else if (strcmp(name,"SmbHIce")==0) return SmbHIceEnum;
+	      else if (strcmp(name,"SmbHSnow")==0) return SmbHSnowEnum;
 	      else if (strcmp(name,"SmbHref")==0) return SmbHrefEnum;
 	      else if (strcmp(name,"SmbIsInitialized")==0) return SmbIsInitializedEnum;
@@ -1089,4 +1102,5 @@
 	      else if (strcmp(name,"SmbMassBalanceSubstep")==0) return SmbMassBalanceSubstepEnum;
 	      else if (strcmp(name,"SmbMassBalanceTransient")==0) return SmbMassBalanceTransientEnum;
+	      else if (strcmp(name,"SmbMask")==0) return SmbMaskEnum;
 	      else if (strcmp(name,"SmbMeanLHF")==0) return SmbMeanLHFEnum;
 	      else if (strcmp(name,"SmbMeanSHF")==0) return SmbMeanSHFEnum;
@@ -1107,5 +1121,8 @@
 	      else if (strcmp(name,"SmbPrecipitationsReconstructed")==0) return SmbPrecipitationsReconstructedEnum;
 	      else if (strcmp(name,"SmbRain")==0) return SmbRainEnum;
-	      else if (strcmp(name,"SmbRe")==0) return SmbReEnum;
+         else stage=10;
+   }
+   if(stage==10){
+	      if (strcmp(name,"SmbRe")==0) return SmbReEnum;
 	      else if (strcmp(name,"SmbRefreeze")==0) return SmbRefreezeEnum;
 	      else if (strcmp(name,"SmbReini")==0) return SmbReiniEnum;
@@ -1121,8 +1138,6 @@
 	      else if (strcmp(name,"SmbSzaValue")==0) return SmbSzaValueEnum;
 	      else if (strcmp(name,"SmbT")==0) return SmbTEnum;
-         else stage=10;
-   }
-   if(stage==10){
-	      if (strcmp(name,"SmbTa")==0) return SmbTaEnum;
+	      else if (strcmp(name,"SmbTa")==0) return SmbTaEnum;
+	      else if (strcmp(name,"SmbTamp")==0) return SmbTampEnum;
 	      else if (strcmp(name,"SmbTeValue")==0) return SmbTeValueEnum;
 	      else if (strcmp(name,"SmbTemperaturesAnomaly")==0) return SmbTemperaturesAnomalyEnum;
@@ -1229,5 +1244,8 @@
 	      else if (strcmp(name,"WaterfractionDrainageIntegrated")==0) return WaterfractionDrainageIntegratedEnum;
 	      else if (strcmp(name,"Waterfraction")==0) return WaterfractionEnum;
-	      else if (strcmp(name,"Waterheight")==0) return WaterheightEnum;
+         else stage=11;
+   }
+   if(stage==11){
+	      if (strcmp(name,"Waterheight")==0) return WaterheightEnum;
 	      else if (strcmp(name,"WaterPressureArmaPerturbation")==0) return WaterPressureArmaPerturbationEnum;
 	      else if (strcmp(name,"WaterPressureValuesAutoregression")==0) return WaterPressureValuesAutoregressionEnum;
@@ -1244,8 +1262,5 @@
 	      else if (strcmp(name,"Outputdefinition13")==0) return Outputdefinition13Enum;
 	      else if (strcmp(name,"Outputdefinition14")==0) return Outputdefinition14Enum;
-         else stage=11;
-   }
-   if(stage==11){
-	      if (strcmp(name,"Outputdefinition15")==0) return Outputdefinition15Enum;
+	      else if (strcmp(name,"Outputdefinition15")==0) return Outputdefinition15Enum;
 	      else if (strcmp(name,"Outputdefinition16")==0) return Outputdefinition16Enum;
 	      else if (strcmp(name,"Outputdefinition17")==0) return Outputdefinition17Enum;
@@ -1352,5 +1367,8 @@
 	      else if (strcmp(name,"AmrNeopz")==0) return AmrNeopzEnum;
 	      else if (strcmp(name,"AndroidFrictionCoefficient")==0) return AndroidFrictionCoefficientEnum;
-	      else if (strcmp(name,"Arrhenius")==0) return ArrheniusEnum;
+         else stage=12;
+   }
+   if(stage==12){
+	      if (strcmp(name,"Arrhenius")==0) return ArrheniusEnum;
 	      else if (strcmp(name,"AutodiffJacobian")==0) return AutodiffJacobianEnum;
 	      else if (strcmp(name,"Balancethickness2Analysis")==0) return Balancethickness2AnalysisEnum;
@@ -1367,8 +1385,5 @@
 	      else if (strcmp(name,"BeckmannGoosseFloatingMeltRate")==0) return BeckmannGoosseFloatingMeltRateEnum;
 	      else if (strcmp(name,"BedSlopeSolution")==0) return BedSlopeSolutionEnum;
-         else stage=12;
-   }
-   if(stage==12){
-	      if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum;
+	      else if (strcmp(name,"BoolExternalResult")==0) return BoolExternalResultEnum;
 	      else if (strcmp(name,"BoolInput")==0) return BoolInputEnum;
 	      else if (strcmp(name,"IntInput")==0) return IntInputEnum;
@@ -1475,5 +1490,8 @@
 	      else if (strcmp(name,"GroundingOnly")==0) return GroundingOnlyEnum;
 	      else if (strcmp(name,"GroundinglineMassFlux")==0) return GroundinglineMassFluxEnum;
-	      else if (strcmp(name,"Gset")==0) return GsetEnum;
+         else stage=13;
+   }
+   if(stage==13){
+	      if (strcmp(name,"Gset")==0) return GsetEnum;
 	      else if (strcmp(name,"Gsl")==0) return GslEnum;
 	      else if (strcmp(name,"HOApproximation")==0) return HOApproximationEnum;
@@ -1490,8 +1508,5 @@
 	      else if (strcmp(name,"HydrologyShreveAnalysis")==0) return HydrologyShreveAnalysisEnum;
 	      else if (strcmp(name,"HydrologySolution")==0) return HydrologySolutionEnum;
-         else stage=13;
-   }
-   if(stage==13){
-	      if (strcmp(name,"HydrologySubsteps")==0) return HydrologySubstepsEnum;
+	      else if (strcmp(name,"HydrologySubsteps")==0) return HydrologySubstepsEnum;
 	      else if (strcmp(name,"HydrologySubTime")==0) return HydrologySubTimeEnum;
 	      else if (strcmp(name,"Hydrologydc")==0) return HydrologydcEnum;
@@ -1598,5 +1613,8 @@
 	      else if (strcmp(name,"None")==0) return NoneEnum;
 	      else if (strcmp(name,"Numberedcostfunction")==0) return NumberedcostfunctionEnum;
-	      else if (strcmp(name,"NyeCO2")==0) return NyeCO2Enum;
+         else stage=14;
+   }
+   if(stage==14){
+	      if (strcmp(name,"NyeCO2")==0) return NyeCO2Enum;
 	      else if (strcmp(name,"NyeH2O")==0) return NyeH2OEnum;
 	      else if (strcmp(name,"Numericalflux")==0) return NumericalfluxEnum;
@@ -1613,8 +1631,5 @@
 	      else if (strcmp(name,"P1DG")==0) return P1DGEnum;
 	      else if (strcmp(name,"P1P1")==0) return P1P1Enum;
-         else stage=14;
-   }
-   if(stage==14){
-	      if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum;
+	      else if (strcmp(name,"P1P1GLS")==0) return P1P1GLSEnum;
 	      else if (strcmp(name,"P1bubble")==0) return P1bubbleEnum;
 	      else if (strcmp(name,"P1bubblecondensed")==0) return P1bubblecondensedEnum;
@@ -1721,5 +1736,8 @@
 	      else if (strcmp(name,"TransientParam")==0) return TransientParamEnum;
 	      else if (strcmp(name,"TransientSolution")==0) return TransientSolutionEnum;
-	      else if (strcmp(name,"Tria")==0) return TriaEnum;
+         else stage=15;
+   }
+   if(stage==15){
+	      if (strcmp(name,"Tria")==0) return TriaEnum;
 	      else if (strcmp(name,"TriaInput")==0) return TriaInputEnum;
 	      else if (strcmp(name,"UzawaPressureAnalysis")==0) return UzawaPressureAnalysisEnum;
@@ -1736,8 +1754,5 @@
 	      else if (strcmp(name,"XYZ")==0) return XYZEnum;
 	      else if (strcmp(name,"BalancethicknessD0")==0) return BalancethicknessD0Enum;
-         else stage=15;
-   }
-   if(stage==15){
-	      if (strcmp(name,"BalancethicknessDiffusionCoefficient")==0) return BalancethicknessDiffusionCoefficientEnum;
+	      else if (strcmp(name,"BalancethicknessDiffusionCoefficient")==0) return BalancethicknessDiffusionCoefficientEnum;
 	      else if (strcmp(name,"BilinearInterp")==0) return BilinearInterpEnum;
 	      else if (strcmp(name,"CalvingdevCoeff")==0) return CalvingdevCoeffEnum;
Index: /issm/trunk-jpl/src/m/classes/SMBsemic.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/SMBsemic.m	(revision 27497)
+++ /issm/trunk-jpl/src/m/classes/SMBsemic.m	(revision 27498)
@@ -15,5 +15,10 @@
 		dailyairhumidity	= NaN;
 		dailytemperature	= NaN;
+		Tamp              = NaN;
+		mask              = NaN;
+		hice              = NaN;
+		hsnow             = NaN;
 		desfac				= 0;
+		desfacElevation   = 0;
 		rlaps				= 0;
 		rdl					= 0;
@@ -22,4 +27,19 @@
 		averaging			= 0;
 		requested_outputs	= {};
+
+		hcrit             = 0;
+		rcrit             = 0;
+
+		% albedo
+		albedo            = 0;
+		albedo_snow       = 0;
+		albedo_scheme     = 0;
+		alb_smax = NaN;
+		alb_smin = NaN;
+		albi = NaN;
+		albl = NaN;
+
+		% method
+		ismethod          = 0;
 	end
 	methods
@@ -54,13 +74,28 @@
 				disp('      no SMBsemic.s0gcm specified: values set as zero');
 			end
-
+			self.Tamp       = 3*ones(md.mesh.numberofvertices,1);
+			self.albedo     = 0.8*ones(md.mesh.numberofvertices,1);
+			self.albedo_snow= 0.5*ones(md.mesh.numberofvertices,1);
+			self.hice       = zeros(md.mesh.numberofvertices,1);
+			self.hsnow      = 5*ones(md.mesh.numberofvertices,1);
 		end % }}}
 		function self = setdefaultparameters(self) % {{{
 
-			self.desfac		= -log(2.0)/1000;
-			self.rlaps		= 7.4;
-			self.rdl			= 0.29;
+			self.albedo_scheme   = 0;
+			self.alb_smax = 0.79;
+			self.alb_smin = 0.6;
+			self.albi = 0.41;
+			self.albl = 0.07;
+
+			self.hcrit = 0.028;% from Krapp et al. (2017)
+			self.rcrit = 0.85; % from Krapp et al. (2017)
+		
+			self.desfac		      = -log(2.0)/1000;
+			self.desfacElevation = 2000;
+			self.rlaps		      = 7.4;
+			self.rdl			      = 0.29;
+
+			self.ismethod        = 0;
 			self.requested_outputs={'default'};
-
 		end % }}}zo
 		function md = checkconsistency(self,md,solution,analyses) % {{{
@@ -80,4 +115,25 @@
 				md = checkfield(md,'fieldname','smb.dailyairhumidity','timeseries',1,'NaN',1,'Inf',1);
 				md = checkfield(md,'fieldname','smb.dailytemperature','timeseries',1,'NaN',1,'Inf',1);
+
+				% TODO: transient model should be merged with SEMIC developed by Ruckamp et al. (2018)
+
+				md = checkfield(md,'fieldname','smb.ismethod','numel',1,'values',[0,1]);
+				if self.ismethod == 1 % transient mode.
+					md = checkfield(md,'fieldname','smb.desfacElevation','>=',0,'numel',1);
+
+					md = checkfield(md,'fieldname','smb.albedo_scheme','NaN',1,'Inf',1,'numel',1,'values',[0,1,2,3,4]);
+					md = checkfield(md,'fieldname','smb.alb_smax','>=',0,'NaN',1,'Inf',1,'numel',1);
+					md = checkfield(md,'fieldname','smb.mask','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices, 1],'values',[0,1,2]);
+
+					% initial values
+					md = checkfield(md,'fieldname','smb.albedo','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices, 1]);
+					md = checkfield(md,'fieldname','smb.albedo_snow','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices, 1]);
+					md = checkfield(md,'fieldname','smb.alb_smax','>=',0,'<=',1,'NaN',1,'Inf',1,'numel',1);
+					md = checkfield(md,'fieldname','smb.alb_smin','>=',0,'<=',1,'NaN',1,'Inf',1,'numel',1);
+					md = checkfield(md,'fieldname','smb.albi','>=',0,'<=',1,'NaN',1,'Inf',1,'numel',1);
+					md = checkfield(md,'fieldname','smb.albl','>=',0,'<=',1,'NaN',1,'Inf',1,'numel',1);
+					md = checkfield(md,'fieldname','smb.hice','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices, 1]);
+					md = checkfield(md,'fieldname','smb.hsnow','NaN',1,'Inf',1,'size',[md.mesh.numberofvertices, 1]);
+				end
 			end
 			md = checkfield(md,'fieldname','smb.steps_per_step','>=',1,'numel',[1]);
@@ -106,4 +162,25 @@
 			fielddisplay(self,'rdl','longwave downward radiation decrease (default is 0.29 [W/m^2/km]; Marty et al. 2002)');
 			fielddisplay(self,'s0gcm','GCM reference elevation; (default is 0) [m]');
+
+			fielddisplay(self,'ismethod','method for calculating SMB with SEMIC. Default version of SEMIC is really slow. 0: steady, 1: transient (default: 0)');
+			if self.ismethod == 1 % tranisent mode
+				fielddisplay(self,'desfacElevation','desertification elevation (default is 2000 m; Vizcaino et al. 2010)');
+				fielddisplay(self,'Tamp','amplitude of diurnal cycle [K]');
+				fielddisplay(self,'albedo','initial albedo [no unit]');
+				fielddisplay(self,'albedo_snow','initial albedo for snow [no unit]');
+				fielddisplay(self,'hice','initial thickness of ice [unit: m]');
+				fielddisplay(self,'hsnow','initial thickness of snow [unit: m]');
+				fielddisplay(self,'mask','masking for albedo. 0: ocean, 1: land, 2: ice (default: 2)');
+				fielddisplay(self,'hcrit','critical snow height for albedo [unit: m]');
+				fielddisplay(self,'rcrit','critical refreezing height for albedo [no unit]');
+
+				disp(sprintf('\nSEMIC albedo parameters.'));
+				fielddisplay(self,'albedo_scheme','albedo scheme for SEMIC. 0: none, 1: slater, 2: isba, 3: denby, 4: alex (default is 0)');
+				fielddisplay(self,'abl_smax','maximum snow albedo (default: 0.79)');
+				fielddisplay(self,'abl_smin','minimum snow albedo (default: 0.6)');
+				fielddisplay(self,'albi','background albeod for bare ice (default: 0.41)');
+				fielddisplay(self,'albl','background albeod for bare land (default: 0.07)');
+			end
+
 			fielddisplay(self, 'steps_per_step', 'number of smb steps per time step');
 			fielddisplay(self, 'averaging', 'averaging methods from short to long steps');
@@ -119,5 +196,7 @@
 			WriteData(fid,prefix,'name','md.smb.model','data',12,'format','Integer');
 
+			WriteData(fid,prefix,'object',self,'class','smb','fieldname','ismethod','format','Integer','values',[0, 1]);
 			WriteData(fid,prefix,'object',self,'class','smb','fieldname','desfac','format','Double');
+			WriteData(fid,prefix,'object',self,'class','smb','fieldname','desfacElevation','format','Double');
 			WriteData(fid,prefix,'object',self,'class','smb','fieldname','s0gcm','format','DoubleMat','mattype',1);
 			WriteData(fid,prefix,'object',self,'class','smb','fieldname','rlaps','format','Double');
@@ -132,6 +211,27 @@
 			WriteData(fid,prefix,'object',self,'class','smb','fieldname','dailyairhumidity','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',yts);
 			WriteData(fid,prefix,'object',self,'class','smb','fieldname','dailytemperature','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',yts);
+			% TODO: transient mode should be merged with SEMIC developed by Ruckamp et al. (2018).
+			if self.ismethod == 1% transient mode.
+				WriteData(fid,prefix,'object',self,'class','smb','fieldname','Tamp','format','DoubleMat','mattype',1);
+				WriteData(fid,prefix,'object',self,'class','smb','fieldname','mask','format','DoubleMat','mattype',1);
+				WriteData(fid,prefix,'object',self,'class','smb','fieldname','hice','format','DoubleMat','mattype',1);
+				WriteData(fid,prefix,'object',self,'class','smb','fieldname','hsnow','format','DoubleMat','mattype',1);
+
+				WriteData(fid,prefix,'object',self,'class','smb','fieldname','hcrit','format','Double');
+				WriteData(fid,prefix,'object',self,'class','smb','fieldname','rcrit','format','Double');
+
+				%albedo...
+				WriteData(fid,prefix,'object',self,'class','smb','fieldname','albedo','format','DoubleMat','mattype',1);
+				WriteData(fid,prefix,'object',self,'class','smb','fieldname','albedo_snow','format','DoubleMat','mattype',1);
+				WriteData(fid,prefix,'object',self,'class','smb','fieldname','albedo_scheme','format','Integer');
+				WriteData(fid,prefix,'object',self,'class','smb','fieldname','albi','format','Double');
+				WriteData(fid,prefix,'object',self,'class','smb','fieldname','albl','format','Double');
+				WriteData(fid,prefix,'object',self,'class','smb','fieldname','alb_smin','format','Double');
+				WriteData(fid,prefix,'object',self,'class','smb','fieldname','alb_smax','format','Double');
+			end
+
 			WriteData(fid,prefix,'object',self,'fieldname','steps_per_step','format','Integer');
 			WriteData(fid,prefix,'object',self,'fieldname','averaging','format','Integer');
+
 			%process requested outputs
 			outputs = self.requested_outputs;
