Index: /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
===================================================================
--- /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 23757)
+++ /issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp	(revision 23758)
@@ -5151,5 +5151,4 @@
 void           StressbalanceAnalysis::InputUpdateFromSolutionFS(IssmDouble* solution,Element* element){/*{{{*/
 
-	bool         results_on_nodes;
 	int          i,dim;
 	int*         vdoflist=NULL;
@@ -5159,5 +5158,4 @@
 	element->FindParam(&dim,DomainDimensionEnum);
 	element->FindParam(&FSreconditioning,StressbalanceFSreconditioningEnum);
-	element->FindParam(&results_on_nodes,SettingsResultsOnNodesEnum);
 
 	/*Fetch number of nodes and dof for this finite element*/
Index: /issm/trunk-jpl/src/c/classes/FemModel.cpp
===================================================================
--- /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 23757)
+++ /issm/trunk-jpl/src/c/classes/FemModel.cpp	(revision 23758)
@@ -2134,8 +2134,9 @@
 	/*Intermediaries*/
 	bool        isvec,results_on_nodes;
-	int         step,output_enum;
+	int         step,output_enum,numonnodes;
 	IssmDouble  time;
 	IssmDouble  double_result;
 	const char *output_string = NULL;
+	char**      resultsonnodes = NULL;
 
 	/*recover results*/
@@ -2146,5 +2147,6 @@
 	parameters->FindParam(&step,StepEnum);
 	parameters->FindParam(&time,TimeEnum);
-	parameters->FindParam(&results_on_nodes,SettingsResultsOnNodesEnum);
+	parameters->FindParam(&numonnodes,SettingsNumResultsOnNodesEnum);
+	if(numonnodes) parameters->FindParam(&resultsonnodes,&numonnodes,SettingsResultsOnNodesEnum);
 
 	/*Go through all requested output*/
@@ -2249,4 +2251,10 @@
 						ISSM_MPI_Bcast(&nodesperelement,1,ISSM_MPI_INT,0,IssmComm::GetComm());
 						ISSM_MPI_Bcast(&array_size,1,ISSM_MPI_INT,0,IssmComm::GetComm());
+
+						results_on_nodes=false;
+						/*Loop to see if this output was requested on nodes*/
+						for(int j=0;j<numonnodes & results_on_nodes==false;j++){
+							if(strcmp(resultsonnodes[j],output_string) == 0 || strcmp(resultsonnodes[j],"all") == 0) results_on_nodes=true;
+						}
 
 						if(results_on_nodes){
Index: /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 23757)
+++ /issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp	(revision 23758)
@@ -21,4 +21,5 @@
 	int         numoutputs,basalforcing_model,timestepping_type;
 	char**      requestedoutputs = NULL;
+	char**      outputonnodes = NULL;
 	char*       fieldname = NULL;
 	IssmDouble  time;
@@ -54,5 +55,4 @@
 	parameters->AddObject(iomodel->CopyConstantObject("md.settings.waitonlock",SettingsWaitonlockEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.mesh.numberofvertices",MeshNumberofverticesEnum));
-	parameters->AddObject(iomodel->CopyConstantObject("md.settings.results_on_nodes",SettingsResultsOnNodesEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.settings.io_gather",SettingsIoGatherEnum));
 	parameters->AddObject(iomodel->CopyConstantObject("md.settings.solver_residue_threshold",SettingsSolverResidueThresholdEnum));
@@ -261,4 +261,10 @@
 	/*By default, save all results*/
 	parameters->AddObject(new BoolParam(SaveResultsEnum,true));
+
+	/*Should we output results on nodes?*/
+	iomodel->FindConstant(&outputonnodes,&numoutputs,"md.settings.results_on_nodes");
+	parameters->AddObject(new IntParam(SettingsNumResultsOnNodesEnum,numoutputs));
+	if(numoutputs)parameters->AddObject(new StringArrayParam(SettingsResultsOnNodesEnum,outputonnodes,numoutputs));
+	iomodel->DeleteData(&outputonnodes,numoutputs,"md.settings.results_on_nodes");
 
 	/*Requested outputs */
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 23757)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumDefinitions.h	(revision 23758)
@@ -306,4 +306,5 @@
 	SettingsRecordingFrequencyEnum,
 	SettingsResultsOnNodesEnum,
+	SettingsNumResultsOnNodesEnum,
 	SettingsSolverResidueThresholdEnum,
 	SettingsWaitonlockEnum,
Index: /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 23757)
+++ /issm/trunk-jpl/src/c/shared/Enum/EnumToStringx.cpp	(revision 23758)
@@ -314,4 +314,5 @@
 		case SettingsRecordingFrequencyEnum : return "SettingsRecordingFrequency";
 		case SettingsResultsOnNodesEnum : return "SettingsResultsOnNodes";
+		case SettingsNumResultsOnNodesEnum : return "SettingsNumResultsOnNodes";
 		case SettingsSolverResidueThresholdEnum : return "SettingsSolverResidueThreshold";
 		case SettingsWaitonlockEnum : return "SettingsWaitonlock";
Index: /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 23757)
+++ /issm/trunk-jpl/src/c/shared/Enum/StringToEnumx.cpp	(revision 23758)
@@ -320,4 +320,5 @@
 	      else if (strcmp(name,"SettingsRecordingFrequency")==0) return SettingsRecordingFrequencyEnum;
 	      else if (strcmp(name,"SettingsResultsOnNodes")==0) return SettingsResultsOnNodesEnum;
+	      else if (strcmp(name,"SettingsNumResultsOnNodes")==0) return SettingsNumResultsOnNodesEnum;
 	      else if (strcmp(name,"SettingsSolverResidueThreshold")==0) return SettingsSolverResidueThresholdEnum;
 	      else if (strcmp(name,"SettingsWaitonlock")==0) return SettingsWaitonlockEnum;
@@ -382,9 +383,9 @@
 	      else if (strcmp(name,"StressbalanceIsnewton")==0) return StressbalanceIsnewtonEnum;
 	      else if (strcmp(name,"StressbalanceMaxiter")==0) return StressbalanceMaxiterEnum;
-	      else if (strcmp(name,"StressbalanceNumRequestedOutputs")==0) return StressbalanceNumRequestedOutputsEnum;
          else stage=4;
    }
    if(stage==4){
-	      if (strcmp(name,"StressbalancePenaltyFactor")==0) return StressbalancePenaltyFactorEnum;
+	      if (strcmp(name,"StressbalanceNumRequestedOutputs")==0) return StressbalanceNumRequestedOutputsEnum;
+	      else if (strcmp(name,"StressbalancePenaltyFactor")==0) return StressbalancePenaltyFactorEnum;
 	      else if (strcmp(name,"StressbalanceReltol")==0) return StressbalanceReltolEnum;
 	      else if (strcmp(name,"StressbalanceRequestedOutputs")==0) return StressbalanceRequestedOutputsEnum;
@@ -505,9 +506,9 @@
 	      else if (strcmp(name,"EtaDiff")==0) return EtaDiffEnum;
 	      else if (strcmp(name,"FrictionAs")==0) return FrictionAsEnum;
-	      else if (strcmp(name,"FrictionC")==0) return FrictionCEnum;
          else stage=5;
    }
    if(stage==5){
-	      if (strcmp(name,"FrictionCoefficientcoulomb")==0) return FrictionCoefficientcoulombEnum;
+	      if (strcmp(name,"FrictionC")==0) return FrictionCEnum;
+	      else if (strcmp(name,"FrictionCoefficientcoulomb")==0) return FrictionCoefficientcoulombEnum;
 	      else if (strcmp(name,"FrictionCoefficient")==0) return FrictionCoefficientEnum;
 	      else if (strcmp(name,"FrictionEffectivePressure")==0) return FrictionEffectivePressureEnum;
@@ -628,9 +629,9 @@
 	      else if (strcmp(name,"SmbDailytemperature")==0) return SmbDailytemperatureEnum;
 	      else if (strcmp(name,"SmbD")==0) return SmbDEnum;
-	      else if (strcmp(name,"SmbDini")==0) return SmbDiniEnum;
          else stage=6;
    }
    if(stage==6){
-	      if (strcmp(name,"SmbDlwrf")==0) return SmbDlwrfEnum;
+	      if (strcmp(name,"SmbDini")==0) return SmbDiniEnum;
+	      else if (strcmp(name,"SmbDlwrf")==0) return SmbDlwrfEnum;
 	      else if (strcmp(name,"SmbDswrf")==0) return SmbDswrfEnum;
 	      else if (strcmp(name,"SmbDz")==0) return SmbDzEnum;
@@ -751,9 +752,9 @@
 	      else if (strcmp(name,"AdjointBalancethickness2Analysis")==0) return AdjointBalancethickness2AnalysisEnum;
 	      else if (strcmp(name,"AdjointBalancethicknessAnalysis")==0) return AdjointBalancethicknessAnalysisEnum;
-	      else if (strcmp(name,"AdjointHorizAnalysis")==0) return AdjointHorizAnalysisEnum;
          else stage=7;
    }
    if(stage==7){
-	      if (strcmp(name,"Adjointp")==0) return AdjointpEnum;
+	      if (strcmp(name,"AdjointHorizAnalysis")==0) return AdjointHorizAnalysisEnum;
+	      else if (strcmp(name,"Adjointp")==0) return AdjointpEnum;
 	      else if (strcmp(name,"AggressiveMigration")==0) return AggressiveMigrationEnum;
 	      else if (strcmp(name,"AmrBamg")==0) return AmrBamgEnum;
@@ -874,9 +875,9 @@
 	      else if (strcmp(name,"Gradient3")==0) return Gradient3Enum;
 	      else if (strcmp(name,"GroundedArea")==0) return GroundedAreaEnum;
-	      else if (strcmp(name,"GroundedAreaScaled")==0) return GroundedAreaScaledEnum;
          else stage=8;
    }
    if(stage==8){
-	      if (strcmp(name,"GroundingOnly")==0) return GroundingOnlyEnum;
+	      if (strcmp(name,"GroundedAreaScaled")==0) return GroundedAreaScaledEnum;
+	      else if (strcmp(name,"GroundingOnly")==0) return GroundingOnlyEnum;
 	      else if (strcmp(name,"Gset")==0) return GsetEnum;
 	      else if (strcmp(name,"Gsl")==0) return GslEnum;
@@ -997,9 +998,9 @@
 	      else if (strcmp(name,"Outputdefinition12")==0) return Outputdefinition12Enum;
 	      else if (strcmp(name,"Outputdefinition13")==0) return Outputdefinition13Enum;
-	      else if (strcmp(name,"Outputdefinition14")==0) return Outputdefinition14Enum;
          else stage=9;
    }
    if(stage==9){
-	      if (strcmp(name,"Outputdefinition15")==0) return Outputdefinition15Enum;
+	      if (strcmp(name,"Outputdefinition14")==0) return Outputdefinition14Enum;
+	      else if (strcmp(name,"Outputdefinition15")==0) return Outputdefinition15Enum;
 	      else if (strcmp(name,"Outputdefinition16")==0) return Outputdefinition16Enum;
 	      else if (strcmp(name,"Outputdefinition17")==0) return Outputdefinition17Enum;
@@ -1120,9 +1121,9 @@
 	      else if (strcmp(name,"Regionaloutput")==0) return RegionaloutputEnum;
 	      else if (strcmp(name,"Regular")==0) return RegularEnum;
-	      else if (strcmp(name,"Riftfront")==0) return RiftfrontEnum;
          else stage=10;
    }
    if(stage==10){
-	      if (strcmp(name,"Scaled")==0) return ScaledEnum;
+	      if (strcmp(name,"Riftfront")==0) return RiftfrontEnum;
+	      else if (strcmp(name,"Scaled")==0) return ScaledEnum;
 	      else if (strcmp(name,"SealevelAbsolute")==0) return SealevelAbsoluteEnum;
 	      else if (strcmp(name,"SealevelEmotion")==0) return SealevelEmotionEnum;
Index: /issm/trunk-jpl/src/m/classes/issmsettings.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/issmsettings.m	(revision 23757)
+++ /issm/trunk-jpl/src/m/classes/issmsettings.m	(revision 23758)
@@ -6,5 +6,5 @@
 classdef issmsettings
 	properties (SetAccess=public) 
-		results_on_nodes    = 0;
+		results_on_nodes    = {};
 		io_gather           = 0;
 		lowmem              = 0;
@@ -61,5 +61,5 @@
 		function md = checkconsistency(self,md,solution,analyses) % {{{
 
-			md = checkfield(md,'fieldname','settings.results_on_nodes','numel',[1],'values',[0 1]);
+			md = checkfield(md,'fieldname','settings.results_on_nodes','stringrow',1);
 			md = checkfield(md,'fieldname','settings.io_gather','numel',[1],'values',[0 1]);
 			md = checkfield(md,'fieldname','settings.lowmem','numel',[1],'values',[0 1]);
@@ -74,5 +74,5 @@
 			disp(sprintf('   general issmsettings parameters:'));
 
-			fielddisplay(self,'results_on_nodes','results are output for all the nodes of each element');
+			fielddisplay(self,'results_on_nodes','list of output for which results will be output for all the nodes of each element, Use ''all'' for all output on nodes.');
 			fielddisplay(self,'io_gather','I/O gathering strategy for result outputs (default 1)');
 			fielddisplay(self,'lowmem','is the memory limited ? (0 or 1)');
@@ -90,5 +90,5 @@
 		end % }}}
 		function marshall(self,prefix,md,fid) % {{{
-			WriteData(fid,prefix,'object',self,'class','settings','fieldname','results_on_nodes','format','Boolean');
+			WriteData(fid,prefix,'data',self.results_on_nodes,'name','md.settings.results_on_nodes','format','StringArray');
 			WriteData(fid,prefix,'object',self,'class','settings','fieldname','io_gather','format','Boolean');
 			WriteData(fid,prefix,'object',self,'class','settings','fieldname','lowmem','format','Boolean');
@@ -101,5 +101,5 @@
 		function savemodeljs(self,fid,modelname) % {{{
 		
-			writejsdouble(fid,[modelname '.settings.results_on_nodes'],self.results_on_nodes);
+			writejscellstring(fid,[modelname '.settings.results_on_nodes'],self.results_on_nodes);
 			writejsdouble(fid,[modelname '.settings.io_gather'],self.io_gather);
 			writejsdouble(fid,[modelname '.settings.lowmem'],self.lowmem);
Index: /issm/trunk-jpl/src/m/classes/issmsettings.py
===================================================================
--- /issm/trunk-jpl/src/m/classes/issmsettings.py	(revision 23757)
+++ /issm/trunk-jpl/src/m/classes/issmsettings.py	(revision 23758)
@@ -12,5 +12,5 @@
 
 	def __init__(self): # {{{
-		self.results_on_nodes    = 0
+		self.results_on_nodes    = []
 		self.io_gather           = 0
 		self.lowmem              = 0
@@ -28,5 +28,5 @@
 		string="   general issmsettings parameters:"
 
-		string="%s\n%s"%(string,fielddisplay(self,"results_on_nodes","results are output for all the nodes of each element"))
+		string="%s\n%s"%(string,fielddisplay(self,"results_on_nodes","list of output for which results will be output for all the nodes of each element, Use 'all' for all output on nodes."))
 		string="%s\n%s"%(string,fielddisplay(self,"io_gather","I/O gathering strategy for result outputs (default 1)"))
 		string="%s\n%s"%(string,fielddisplay(self,"lowmem","is the memory limited ? (0 or 1)"))
@@ -68,5 +68,5 @@
 	#}}}
 	def checkconsistency(self,md,solution,analyses):    # {{{
-		md = checkfield(md,'fieldname','settings.results_on_nodes','numel',[1],'values',[0,1])
+		md = checkfield(md,'fieldname','settings.results_on_nodes','stringrow',1)
 		md = checkfield(md,'fieldname','settings.io_gather','numel',[1],'values',[0,1])
 		md = checkfield(md,'fieldname','settings.lowmem','numel',[1],'values',[0,1])
@@ -80,5 +80,5 @@
 	# }}}
 	def marshall(self,prefix,md,fid):    # {{{
-		WriteData(fid,prefix,'object',self,'class','settings','fieldname','results_on_nodes','format','Boolean')
+		WriteData(fid,prefix,'data',self.results_on_nodes,'name','md.settings.results_on_nodes','format','StringArray')
 		WriteData(fid,prefix,'object',self,'class','settings','fieldname','io_gather','format','Boolean')
 		WriteData(fid,prefix,'object',self,'class','settings','fieldname','lowmem','format','Boolean')
Index: /issm/trunk-jpl/src/m/classes/model.m
===================================================================
--- /issm/trunk-jpl/src/m/classes/model.m	(revision 23757)
+++ /issm/trunk-jpl/src/m/classes/model.m	(revision 23758)
@@ -160,4 +160,12 @@
 				end
 				md.frontalforcings=frontalforcings(md.calving); 
+			end
+			%2019 Feb 26
+			if isa(md.settings.results_on_nodes,'double')
+				if md.settings.results_on_nodes == 0
+					md.settings.results_on_nodes = {};
+				else
+					md.settings.results_on_nodes = {'all'};
+				end
 			end
 		end% }}}
