Index: /issm/branches/trunk-larour-SLPS2022/src/m/classes/dslmme.m
===================================================================
--- /issm/branches/trunk-larour-SLPS2022/src/m/classes/dslmme.m	(revision 27089)
+++ /issm/branches/trunk-larour-SLPS2022/src/m/classes/dslmme.m	(revision 27090)
@@ -49,4 +49,33 @@
 			end
 
+			%check time stamps: they should all be in seconds 
+			%global_average_thermosteric_sea_level {{{
+			for i=1:nt, 
+				h=self.global_average_thermosteric_sea_level{i};
+				times=h(end,:);
+				avgtime=mean(times)
+				if(avgtime<10000)
+					error('dslmme checkconsistency error messages: time tags for global_average_thermosteric_sea_level should be in seconds!');
+				end
+			end %}}}
+			%sea_surface_height_above_geoid {{{
+			for i=1:nt, 
+				h=self.sea_surface_height_above_geoid{i};
+				times=h(end,:);
+				avgtime=mean(times)
+				if(avgtime<10000)
+					error('dslmme checkconsistency error messages: time tags for sea_surface_height_above_geoid should be in seconds!');
+				end
+			end %}}}
+			%sea_water_pressure_at_sea_floor {{{
+			for i=1:nt, 
+				h=self.sea_water_pressure_at_sea_floor{i};
+				times=h(end,:);
+				avgtime=mean(times)
+				if(avgtime<10000)
+					error('dslmme checkconsistency error messages: time tags for sea_water_pressure_at_sea_floor should be in seconds!');
+				end
+			end %}}}
+
 		end % }}}
 		function disp(self) % {{{
@@ -63,7 +92,7 @@
 			WriteData(fid,prefix,'object',self,'fieldname','modelid','format','Double');
 			WriteData(fid,prefix,'name','md.dsl.nummodels','data',length(self.global_average_thermosteric_sea_level),'format','Integer');
-			WriteData(fid,prefix,'object',self,'fieldname','global_average_thermosteric_sea_level','format','MatArray','timeseries',1,'timeserieslength',2);
-			WriteData(fid,prefix,'object',self,'fieldname','sea_water_pressure_at_sea_floor','format','MatArray','timeserieslength',md.mesh.numberofvertices+1);
-			WriteData(fid,prefix,'object',self,'fieldname','sea_surface_height_above_geoid','format','MatArray','timeserieslength',md.mesh.numberofvertices+1);
+			WriteData(fid,prefix,'object',self,'fieldname','global_average_thermosteric_sea_level','format','MatArray','timeseries',1,'timeserieslength',2,'yts',md.constants.yts);
+			WriteData(fid,prefix,'object',self,'fieldname','sea_water_pressure_at_sea_floor','format','MatArray','timeseries',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
+			WriteData(fid,prefix,'object',self,'fieldname','sea_surface_height_above_geoid','format','MatArray','timeseries',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
 
 		end % }}}
Index: /issm/branches/trunk-larour-SLPS2022/src/m/classes/mmemasstransport.m
===================================================================
--- /issm/branches/trunk-larour-SLPS2022/src/m/classes/mmemasstransport.m	(revision 27090)
+++ /issm/branches/trunk-larour-SLPS2022/src/m/classes/mmemasstransport.m	(revision 27090)
@@ -0,0 +1,98 @@
+%MMEMASSTRANSPORT class definition
+%
+%   Usage:
+%      masstransport=mmemasstransport();
+%  A little bit of info here. thickness is an ensemble set of element based time series (cell array 
+%  of matrice size nel x ntimes. 
+%  We supply indices into this ensemble: ex: [1 5 10] and a partition vector (values 0 to nindices-1). 
+%  This means, that when we resolve this MME, we'll have: 
+%  thickness = thickness{0} modified by: 
+%		 - thickness{1} on elements such that their partition value is 0
+%		 - thickness{5} on elements such that their partition value is 1
+%		 - thickness{10} on elements such that their partition value is 2
+%  The goal is to allow to index into different Mmes. Here, partition value 0 might be for GlacierMIP2 
+%  elements, partition value 1 for ISMIP6 Antarctica and value 2 for ISMIP6 Greenland. 
+
+classdef mmemasstransport 
+	properties (SetAccess=public)
+		thickness; %multi model ensemble time series of ice thickness evolution
+		ids; %indices into the ensemble 
+		partition; %partition vector 
+		requested_outputs      = {};
+	end
+	methods
+		function self = mmemasstransport(varargin) % {{{
+			switch nargin
+				case 0
+					self=setdefaultparameters(self);
+				otherwise
+					error('constructor not supported');
+			end
+		end % }}}
+		function self = setdefaultparameters(self) % {{{
+			self.ids=[];
+			self.thickness={};
+			self.partition=[];
+			%default output
+			self.requested_outputs={'default'};
+		end % }}}
+		function list = defaultoutputs(self,md) % {{{
+			list = {'DeltaIceThickness'};
+		end % }}}
+		function md = checkconsistency(self,md,solution,analyses) % {{{
+
+			nids=length(self.ids); 
+			nt=length(self.thickness);
+			if size(self.ids,1) < size(self.ids,2),
+				error('mmemasstransport checkconsistency error message: ids should be a column vector');
+			end
+			md = checkfield(md,'field',self.partition,'fieldname','partition','NaN',1,'Inf',1,'>=',-1,'<=',nids-1,'size',[md.mesh.numberofelements,1]);
+			md = checkfield(md,'field',self.ids,'fieldname','ids','NaN',1,'Inf',1,'>=',1,'<=',nt);
+			for i=1:nt,
+				md = checkfield(md,'field',self.thickness{i},'fieldname',['self.thickness{' num2str(i) '}'],'NaN',0,'Inf',1,'timeseries',1,'timeserieslength',md.mesh.numberofelements+1); %don't check for NaN, as it's a legit value here for vertices that do not belong to the current Mme. 
+			end
+			md = checkfield(md,'fieldname','mmemasstransport.requested_outputs','stringrow',1);
+
+			%check time stamps: they should be in seconds 
+			for i=1:nt, 
+				h=self.thickness{i};
+				times=h(end,:);
+				avgtime=mean(times)
+				if(avgtime<10000)
+					error('mmemasstransport checkconsistency error messages: time tags for thicknesses should be in seconds!');
+				end
+			end
+		end % }}}
+		function disp(self) % {{{
+			disp(sprintf('   mmemasstransport: '));
+			fielddisplay(self,'thickness','ensemble set of thickness changes');
+			fielddisplay(self,'ids','indices  into the ensemble set');
+			fielddisplay(self,'partition','partition vector');
+			fielddisplay(self,'requested_outputs','additional outputs requested');
+		end % }}}
+		function s=nummodels(self) % {{{
+			s=numel(self.thickness);
+		end % }}}
+		function marshall(self,prefix,md,fid) % {{{
+			
+			WriteData(fid,prefix,'object',self,'fieldname','ids','format','DoubleMat','mattype',3);
+			WriteData(fid,prefix,'object',self,'fieldname','partition','format','DoubleMat','mattype',1);
+			WriteData(fid,prefix,'object',self,'fieldname','thickness','format','MatArray','timeseries',1,'timeserieslength',md.mesh.numberofvertices+1,'yts',md.constants.yts);
+
+			%process requested outputs
+			outputs = self.requested_outputs;
+			pos  = find(ismember(outputs,'default'));
+			if ~isempty(pos),
+				outputs(pos) = [];                         %remove 'default' from outputs
+				outputs      = [outputs defaultoutputs(self,md)]; %add defaults
+			end
+			WriteData(fid,prefix,'data',outputs,'name','md.mmemasstransport.requested_outputs','format','StringArray');
+
+		end % }}}
+		function savemodeljs(self,fid,modelname) % {{{
+			error('mmemasstransport error message: not implemented yet');
+		end % }}}
+		function self = extrude(self,md) % {{{
+		end % }}}
+	end
+end
Index: /issm/branches/trunk-larour-SLPS2022/src/m/classes/mmeofflinesolidearthsolution.m
===================================================================
--- /issm/branches/trunk-larour-SLPS2022/src/m/classes/mmeofflinesolidearthsolution.m	(revision 27089)
+++ /issm/branches/trunk-larour-SLPS2022/src/m/classes/mmeofflinesolidearthsolution.m	(revision 27090)
@@ -50,4 +50,41 @@
 			end
 
+			%check time stamps: they should all be in seconds 
+			%displacementup {{{
+			for i=1:nt, 
+				h=self.displacementup{i};
+				times=h(end,:);
+				avgtime=mean(times)
+				if(avgtime<10000)
+					error('dslmme checkconsistency error messages: time tags for displacementup should be in seconds!');
+				end
+			end %}}}
+			%geoid {{{
+			for i=1:nt, 
+				h=self.geoid{i};
+				times=h(end,:);
+				avgtime=mean(times)
+				if(avgtime<10000)
+					error('dslmme checkconsistency error messages: time tags for geoid should be in seconds!');
+				end
+			end %}}}
+			%displacementeast {{{
+			for i=1:nt, 
+				h=self.displacementeast{i};
+				times=h(end,:);
+				avgtime=mean(times)
+				if(avgtime<10000)
+					error('dslmme checkconsistency error messages: time tags for displacementeast should be in seconds!');
+				end
+			end %}}}
+			%displacementnorth {{{
+			for i=1:nt, 
+				h=self.displacementnorth{i};
+				times=h(end,:);
+				avgtime=mean(times)
+				if(avgtime<10000)
+					error('dslmme checkconsistency error messages: time tags for displacementnorth should be in seconds!');
+				end
+			end %}}}
 
 		end % }}}
Index: /issm/branches/trunk-larour-SLPS2022/src/m/classes/model.m
===================================================================
--- /issm/branches/trunk-larour-SLPS2022/src/m/classes/model.m	(revision 27089)
+++ /issm/branches/trunk-larour-SLPS2022/src/m/classes/model.m	(revision 27090)
@@ -36,4 +36,5 @@
 		hydrology        = 0;
 		masstransport    = 0;
+		mmemasstransport = 0;
 		thermal          = 0;
 		steadystate      = 0;
@@ -194,4 +195,7 @@
 			%VV
 			if ~isa(md.stochasticforcing,'stochasticforcing'); md.stochasticforcing=stochasticforcing(); end
+			%Mmetransport: Jun 2022: 
+			if ~isa(md.mmemasstransport,'mmemasstransport'); md.mmemasstransport=mmemasstransport(); end;
+
 		end% }}}
 	end
@@ -236,4 +240,5 @@
 			disp(sprintf('%19s: %-22s -- %s','hydrology'       ,['[1x1 ' class(self.hydrology) ']'],'parameters for hydrology solution'));
 			disp(sprintf('%19s: %-22s -- %s','masstransport'   ,['[1x1 ' class(self.masstransport) ']'],'parameters for masstransport solution'));
+			disp(sprintf('%19s: %-22s -- %s','mmemasstransport',['[1x1 ' class(self.mmemasstransport) ']'],'parameters for mmemasstransport solution'));
 			disp(sprintf('%19s: %-22s -- %s','thermal'         ,['[1x1 ' class(self.thermal) ']'],'parameters for thermal solution'));
 			disp(sprintf('%19s: %-22s -- %s','steadystate'     ,['[1x1 ' class(self.steadystate) ']'],'parameters for steadystate solution'));
@@ -283,4 +288,5 @@
 			md.hydrology        = hydrologyshreve();
 			md.masstransport    = masstransport();
+			md.mmemasstransport = mmemasstransport();
 			md.thermal          = thermal();
 			md.steadystate      = steadystate();
@@ -445,4 +451,8 @@
 				md.masstransport.spcthickness=project2d(md,md.masstransport.spcthickness,md.mesh.numberoflayers);
 			end
+			if numel(md.mmemasstransport.spcthickness)>1,
+				md.mmemasstransport.deltathickness=project2d(md,md.mmemasstransport.deltathickness,md.mesh.numberoflayers);
+			end
+
 			if numel(md.damage.spcdamage)>1,
 				md.damage.spcdamage=project2d(md,md.damage.spcdamage,md.mesh.numberoflayers);
@@ -1181,4 +1191,5 @@
 			md.thermal=md.thermal.extrude(md);
 			md.masstransport=md.masstransport.extrude(md);
+			md.mmemasstransport=md.mmemasstransport.extrude(md);
 			md.levelset=extrude(md.levelset,md);
 			md.calving=extrude(md.calving,md);
@@ -1281,4 +1292,7 @@
 			if isfield(structmd,'penalties'), md.masstransport.vertex_pairing=structmd.penalties; end
 			if isfield(structmd,'penalty_offset'), md.masstransport.penalty_factor=structmd.penalty_offset; end
+			if isfield(structmd,'deltathickness'), md.mmemasstransport.deltathickness=structmd.deltathickness; end
+			if isfield(structmd,'partition'), md.mmemasstransport.partition=structmd.partition; end
+			if isfield(structmd,'ids'), md.mmemasstransport.ids=structmd.ids; end
 			if isfield(structmd,'B'), md.materials.rheology_B=structmd.B; end
 			if isfield(structmd,'n'), md.materials.rheology_n=structmd.n; end
Index: /issm/branches/trunk-larour-SLPS2022/src/m/classes/offlinesolidearthsolution.m
===================================================================
--- /issm/branches/trunk-larour-SLPS2022/src/m/classes/offlinesolidearthsolution.m	(revision 27089)
+++ /issm/branches/trunk-larour-SLPS2022/src/m/classes/offlinesolidearthsolution.m	(revision 27090)
@@ -29,5 +29,5 @@
 		end % }}}
 		function marshall(self,prefix,md,fid) % {{{
-			disp(sprintf('   external (offlinesolidearthsolution) solution:'));
+			%disp(sprintf('   external (offlinesolidearthsolution) solution:'));
 			WriteData(fid,prefix,'data',2,'name','md.solidearth.external.nature','format','Integer'); %code 2 for offlinesolidearthsolution  class
 			self.marshall@solidearthsolution(prefix,md,fid);
Index: /issm/branches/trunk-larour-SLPS2022/src/m/classes/solidearthsolution.m
===================================================================
--- /issm/branches/trunk-larour-SLPS2022/src/m/classes/solidearthsolution.m	(revision 27089)
+++ /issm/branches/trunk-larour-SLPS2022/src/m/classes/solidearthsolution.m	(revision 27090)
@@ -38,6 +38,8 @@
 		function md = checkconsistency(self,md,solution,analyses) % {{{
 
-			md = checkfield(md,'fieldname','solidearth.external.displacementeast','Inf',1,'timeseries',1);
-			md = checkfield(md,'fieldname','solidearth.external.displacementnorth','Inf',1,'timeseries',1);
+			if md.solidearth.settings.horiz,
+				md = checkfield(md,'fieldname','solidearth.external.displacementeast','Inf',1,'timeseries',1);
+				md = checkfield(md,'fieldname','solidearth.external.displacementnorth','Inf',1,'timeseries',1);
+			end
 			md = checkfield(md,'fieldname','solidearth.external.displacementup','Inf',1,'timeseries',1);
 			md = checkfield(md,'fieldname','solidearth.external.geoid','Inf',1,'timeseries',1);
Index: /issm/branches/trunk-larour-SLPS2022/src/m/classes/transient.m
===================================================================
--- /issm/branches/trunk-larour-SLPS2022/src/m/classes/transient.m	(revision 27089)
+++ /issm/branches/trunk-larour-SLPS2022/src/m/classes/transient.m	(revision 27090)
@@ -8,4 +8,5 @@
 		issmb             = 0;
 		ismasstransport   = 0;
+		ismmemasstransport   = 0;
 		isoceantransport  = 0;
 		isstressbalance   = 0;
@@ -36,4 +37,5 @@
 			self.issmb             = 0;
 			self.ismasstransport   = 0;
+			self.ismmemasstransport= 0;
 			self.isoceantransport  = 0;
 			self.isstressbalance   = 0;
@@ -57,4 +59,5 @@
 			self.issmb             = 1;
 			self.ismasstransport   = 1;
+			self.ismmemasstransport= 0;
 			self.isoceantransport  = 0;
 			self.isstressbalance   = 1;
@@ -87,4 +90,5 @@
 			md = checkfield(md,'fieldname','transient.issmb','numel',[1],'values',[0 1]);
 			md = checkfield(md,'fieldname','transient.ismasstransport','numel',[1],'values',[0 1]);
+			md = checkfield(md,'fieldname','transient.ismmemasstransport','numel',[1],'values',[0 1]);
 			md = checkfield(md,'fieldname','transient.isoceantransport','numel',[1],'values',[0 1]);
 			md = checkfield(md,'fieldname','transient.isstressbalance','numel',[1],'values',[0 1]);
@@ -113,4 +117,5 @@
 			fielddisplay(self,'issmb','indicates whether a surface mass balance solution is used in the transient');
 			fielddisplay(self,'ismasstransport','indicates whether a masstransport solution is used in the transient');
+			fielddisplay(self,'ismmemasstransport','indicates whether an MME masstransport solution is used in the transient');
 			fielddisplay(self,'isoceantransport','indicates whether an ocean masstransport solution is used in the transient');
 			fielddisplay(self,'isstressbalance','indicates whether a stressbalance solution is used in the transient');
@@ -131,4 +136,5 @@
 			WriteData(fid,prefix,'object',self,'fieldname','issmb','format','Boolean');
 			WriteData(fid,prefix,'object',self,'fieldname','ismasstransport','format','Boolean');
+			WriteData(fid,prefix,'object',self,'fieldname','ismmemasstransport','format','Boolean');
 			WriteData(fid,prefix,'object',self,'fieldname','isoceantransport','format','Boolean');
 			WriteData(fid,prefix,'object',self,'fieldname','isstressbalance','format','Boolean');
@@ -157,4 +163,5 @@
 			writejsdouble(fid,[modelname '.trans.issmb'],self.issmb);
 			writejsdouble(fid,[modelname '.trans.ismasstransport'],self.ismasstransport);
+			writejsdouble(fid,[modelname '.trans.ismmemasstransport'],self.ismmemasstransport);
 			writejsdouble(fid,[modelname '.trans.isoceantransport'],self.isoceantransport);
 			writejsdouble(fid,[modelname '.trans.isstressbalance'],self.isstressbalance);
