Index: /issm/trunk-jpl/src/m/classes/linearbasalforcings.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/linearbasalforcings.m	(revision 24543)
+++ /issm/trunk-jpl/src/m/classes/linearbasalforcings.m	(revision 24544)
@@ -11,4 +11,5 @@
 		upperwater_elevation      = 0.;
 		groundedice_melting_rate  = NaN;
+		perturbation_melting_rate = NaN;
 		geothermalflux            = NaN;
 	end
@@ -25,4 +26,5 @@
 		end % }}}
 		function self = extrude(self,md) % {{{
+			self.perturbation_melting_rate=project3d(md,'vector',self.perturbation_melting_rate,'type','node','layer',1); 
 			self.groundedice_melting_rate=project3d(md,'vector',self.groundedice_melting_rate,'type','node','layer',1); 
 			self.geothermalflux=project3d(md,'vector',self.geothermalflux,'type','node','layer',1); %bedrock only gets geothermal flux
@@ -46,4 +48,8 @@
 		end % }}}
 		function md = checkconsistency(self,md,solution,analyses) % {{{
+
+			if numel(md.basalforcings.perturbation_melting_rate)>1
+				md = checkfield(md,'fieldname','basalforcings.perturbation_melting_rate','NaN',1,'Inf',1,'timeseries',1);
+			end
 
 			if ismember('MasstransportAnalysis',analyses) & ~(strcmp(solution,'TransientSolution') & md.transient.ismasstransport==0),
@@ -78,4 +84,5 @@
 			fielddisplay(self,'upperwater_elevation','elevation of ocean upperwater [m]');
 			fielddisplay(self,'groundedice_melting_rate','basal melting rate (positive if melting) [m/yr]');
+			fielddisplay(self,'perturbation_melting_rate','basal melting rate perturbation added to computed melting rate (positive if melting) [m/yr]');
 			fielddisplay(self,'geothermalflux','geothermal heat flux [W/m^2]');
 
@@ -86,4 +93,5 @@
 
 			WriteData(fid,prefix,'name','md.basalforcings.model','data',2,'format','Integer');
+			WriteData(fid,prefix,'object',self,'fieldname','perturbation_melting_rate','format','DoubleMat','name','md.basalforcings.perturbation_melting_rate','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts)
 			WriteData(fid,prefix,'object',self,'fieldname','groundedice_melting_rate','format','DoubleMat','name','md.basalforcings.groundedice_melting_rate','mattype',1,'scale',1./yts,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts)
 			WriteData(fid,prefix,'object',self,'fieldname','geothermalflux','name','md.basalforcings.geothermalflux','format','DoubleMat','mattype',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
Index: /issm/trunk-jpl/src/m/classes/linearbasalforcings.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/linearbasalforcings.py	(revision 24543)
+++ /issm/trunk-jpl/src/m/classes/linearbasalforcings.py	(revision 24544)
@@ -18,4 +18,5 @@
             print('empty init')
             self.groundedice_melting_rate = float('NaN')
+            self.perturbation_melting_rate = float('NaN')
             self.deepwater_melting_rate = 0.
             self.deepwater_elevation = 0.
@@ -30,4 +31,5 @@
             inv = args[0]
             self.groundedice_melting_rate = inv.groundedice_melting_rate
+            self.perturbation_melting_rate = inv.perturbation_melting_rate
             self.geothermalflux = inv.geothermalflux
             self.deepwater_melting_rate = 0.
@@ -41,5 +43,4 @@
             raise Exception('constructor not supported')
     #}}}
-
     def __repr__(self):  # {{{
         string = "   linear basal forcings parameters:"
@@ -49,8 +50,8 @@
         string = "%s\n%s" % (string, fielddisplay(self, "upperwater_elevation", "elevation of ocean upper water [m]"))
         string = "%s\n%s" % (string, fielddisplay(self, "groundedice_melting_rate", "basal melting rate (positive if melting) [m/yr]"))
+        string = "%s\n%s" % (string, fielddisplay(self, "perturbation_melting_rate", "perturbation applied to computed melting rate (positive if melting) [m/yr]"))
         string = "%s\n%s" % (string, fielddisplay(self, "geothermalflux", "geothermal heat flux [W/m^2]"))
         return string
     #}}}
-
     def initialize(self, md):  # {{{
         if np.all(np.isnan(self.groundedice_melting_rate)):
@@ -59,5 +60,4 @@
         return self
     #}}}
-
     def setdefaultparameters(self):  # {{{
         self.deepwater_melting_rate = 50.0
@@ -68,6 +68,9 @@
         return self
     #}}}
+    def checkconsistency(self, md, solution, analyses):  # {{{
 
-    def checkconsistency(self, md, solution, analyses):  # {{{
+        if not np.all(np.isnan(self.perturbation_melting_rate)):
+            md = checkfield(md, 'fieldname', 'basalforcings.perturbation_melting_rate', 'NaN', 1, 'Inf', 1, 'timeseries', 1)
+
         if 'MasstransportAnalysis' in analyses and not (solution == 'TransientSolution' and not md.transient.ismasstransport):
             md = checkfield(md, 'fieldname', 'basalforcings.groundedice_melting_rate', 'NaN', 1, 'Inf', 1, 'timeseries', 1)
@@ -94,9 +97,9 @@
         return md
     # }}}
-
     def marshall(self, prefix, md, fid):  # {{{
         yts = md.constants.yts
 
         WriteData(fid, prefix, 'name', 'md.basalforcings.model', 'data', 2, 'format', 'Integer')
+        WriteData(fid, prefix, 'object', self, 'fieldname', 'perturbation_melting_rate', 'name', 'md.basalforcings.perturbation_melting_rate', 'format', 'DoubleMat', 'mattype', 1, 'scale', 1. / yts, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
         WriteData(fid, prefix, 'object', self, 'fieldname', 'groundedice_melting_rate', 'name', 'md.basalforcings.groundedice_melting_rate', 'format', 'DoubleMat', 'mattype', 1, 'scale', 1. / yts, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
         WriteData(fid, prefix, 'object', self, 'fieldname', 'geothermalflux', 'name', 'md.basalforcings.geothermalflux', 'format', 'DoubleMat', 'mattype', 1, 'timeserieslength', md.mesh.numberofvertices + 1, 'yts', yts)
