Index: /issm/trunk/src/m/solutions/CorePointerFromSolutionEnum.m
===================================================================
--- /issm/trunk/src/m/solutions/CorePointerFromSolutionEnum.m	(revision 7686)
+++ /issm/trunk/src/m/solutions/CorePointerFromSolutionEnum.m	(revision 7687)
@@ -17,4 +17,5 @@
 	case Transient2DSolutionEnum,              solutioncore='transient2d_core';
 	case Transient3DSolutionEnum,              solutioncore='transient3d_core';
+	case FlaimSolutionEnum,                    solutioncore='flaim_core';
 	case GroundingLineMigration2DSolutionEnum, solutioncore='DUMMYDUMMY';
 	otherwise error('%s%s%s',' solution type: ',EnumToString(solutiontype),' not supported yet!');
Index: /issm/trunk/src/m/solutions/SolutionConfiguration.m
===================================================================
--- /issm/trunk/src/m/solutions/SolutionConfiguration.m	(revision 7686)
+++ /issm/trunk/src/m/solutions/SolutionConfiguration.m	(revision 7687)
@@ -50,4 +50,8 @@
 		analyses=[DiagnosticHorizAnalysisEnum;DiagnosticVertAnalysisEnum;DiagnosticHutterAnalysisEnum;SurfaceSlopeAnalysisEnum;BedSlopeAnalysisEnum;PrognosticAnalysisEnum;ThermalAnalysisEnum;MeltingAnalysisEnum];
 
+	case FlaimSolutionEnum,
+		numanalyses=1; 
+		analyses=[FlaimAnalysisEnum];
+
 	case GroundingLineMigration2DSolutionEnum,
 		numanalyses=0; 
Index: /issm/trunk/src/m/solutions/flaim.m
===================================================================
--- /issm/trunk/src/m/solutions/flaim.m	(revision 7687)
+++ /issm/trunk/src/m/solutions/flaim.m	(revision 7687)
@@ -0,0 +1,102 @@
+function md=flaim(md,options)
+%QMU - apply Quantification of Margins and Uncertainties techniques 
+%      to a solution sequence (like diagnostic.m, progonstic.m, etc ...), 
+%      using the Dakota software from Sandia.
+%
+%   options come from the solve.m routine. They can include flaim options:
+%
+%       fmdir:  any directory where to run the flaim analysis
+%       fmfile: input file for flaim
+%       overwrite: overwrite qmudir before analysis
+%       keep: keep qmudir after analysis
+
+disp('preprocessing flaim inputs');
+
+%first create temporary directory in which we will work
+if strncmpi(options.overwrite,'y',1)
+	system(['rm -rf ' options.fmdir '/*']); 
+else
+	%does the directory exist? if so, then error out
+	if exist(options.fmdir)==7,
+		error('Existing ''%s'' directory, cannot overwrite. Specify ''overwrite'',''y'' option in solve arguments.',options.fmdir);
+	end
+end
+mkdir(options.fmdir)
+system(['cp -p ' md.fm_tracks ' ' options.fmdir]);
+% for testing
+%system(['cp -p issm-split-geikie1-targets.kml ' options.fmdir]);
+%system(['cp -p solution_best.kml ' options.fmdir]);
+%system(['cp -p fm_targets.log ' options.fmdir]);
+cd(options.fmdir)
+
+%  process file names
+
+[pathstr,name,ext,versn] = fileparts(options.fmfile);
+if isempty(ext)
+    ext='.kml';
+end
+filekml=fullfile(pathstr,[name ext versn]);
+ext='.log';
+filelog=fullfile(pathstr,[name ext versn]);
+filesol='solution_best.kml';
+
+%  calculate latitude and longitude, if necessary 
+
+if isempty(md.lat)  || ((numel(md.lat) == 1)  && isnan(md.lat)) || ...
+   isempty(md.long) || ((numel(md.long) == 1) && isnan(md.long))
+	if     ~isfield(options,'latsgn')
+		error(['Missing ''latsgn'' parameter to calculate missing lat/long values.']);
+	elseif (abs(options.latsgn) ~= 1)
+		error(['Incorrect latsgn=' num2str(options.latsgn) ' parameter to calculate missing lat/long values.']);
+	else
+		display('Converting x/y values to lat/long values.');
+		[md.lat,md.long]=xy2ll(md.x,md.y,options.latsgn);
+	end
+end
+
+%  colormap command operates on a figure, so create an invisible one
+%  (could also directly call colormaps, e.g. jet(64), but risky)
+
+if ~isempty(md.fm_criterion)
+	hfig=figure('Visible','off');
+	if isfield(options,'cmap') && ~isempty(options.cmap)
+		colormap(options.cmap)
+	end
+	options.cmap=colormap;
+	close(hfig)
+end
+if ~isfield(options,'cmap')
+	options.cmap=[];
+end
+
+%  write the target kml file
+
+display('Calling KMLMeshWrite.');
+KMLMeshWrite(md.name,md.notes,md.elements,md.nodeconnectivity,md.lat,md.long,md.part,md.fm_criterion,options.cmap,filekml);
+%  for testing
+%filekml='issm-split-geikie1-targets.kml';
+
+%  call flaim
+
+display('Calling flaim.');
+FLAIM_DIR=flaimdir();
+system([FLAIM_DIR '/clasp/swathModule/models/issm/issm.exe -kml ' md.fm_tracks ' -kml ' filekml ' -gridsatequator 200000 -opt 1 -hst 2017-276T02:57:00 -hdur 4d -sparsepoints >& ' filelog]);
+
+%  post-process the flaim output
+
+display(['Post-processing the flaim output in the ''' options.fmdir ''' sub-directory.']);
+if exist(filesol,'file')
+	md.results.FlaimSolution.solution=[options.fmdir '/' filesol];
+end
+if exist(filelog,'file')
+	[status,fline]=system(['grep -i quality ' filelog]);
+	strings=textscan(fline,'%s','delimiter',' =,','MultipleDelimsAsOne',1);
+	md.results.FlaimSolution.quality =sscanf(strings{1}{2},'%f');
+end
+display(md.results.FlaimSolution);
+
+cd ..
+if ~strncmpi(options.keep,'y',1)
+	system(['rm -rf ' options.fmdir]);
+end
+
