Index: /issm/trunk/src/m/kml/edgeadjacency.m
===================================================================
--- /issm/trunk/src/m/kml/edgeadjacency.m	(revision 6311)
+++ /issm/trunk/src/m/kml/edgeadjacency.m	(revision 6312)
@@ -2,5 +2,5 @@
 %  create an edge adjacency table for the elements in the model.
 %
-%  [edgeadj,edgeuns,elemuns]=edgeadjacency(elem,nodecon)
+%  [edgeadj]=edgeadjacency(elem,nodecon)
 %
 %  where the required input is:
@@ -11,9 +11,5 @@
 %    edgeadj       (numeric, edge adjacency array (elems x edges))
 %
-%  the optional output is:
-%    edgeuns       (numeric, unshared edge list (edgeuns x 2))
-%    elemuns       (numeric, unshared edge element list (edgeuns x 1))
-%
-function [edgeadj,edgeuns,elemuns]=edgeadjacency(elem,nodecon)
+function [edgeadj]=edgeadjacency(elem,nodecon)
 
 if ~nargin
@@ -49,23 +45,3 @@
 end
 
-%%  create the unshared edge list
-
-if (nargout >= 2)
-    [icol,irow]=find(edgeadj'==0);
-    edgeuns=zeros(length(irow),2);
-    if (nargout >= 3)
-        elemuns=zeros(length(irow),1);
-    end
-
-%  loop over the edges
-
-    for i=1:length(irow)
-        edgeuns(i,1)=elem(irow(i),icol(i));
-        edgeuns(i,2)=elem(irow(i),mod(icol(i),size(elem,2))+1);
-        if (nargout >= 3)
-            elemuns(i)=irow(i);
-        end
-    end
 end
-
-end
Index: /issm/trunk/src/m/kml/edgeperimeter.m
===================================================================
--- /issm/trunk/src/m/kml/edgeperimeter.m	(revision 6312)
+++ /issm/trunk/src/m/kml/edgeperimeter.m	(revision 6312)
@@ -0,0 +1,82 @@
+%
+%  create an edge perimeter list for the elements in the model.
+%
+%  [edgeper,elemper,iloop]=edgeperimeter(elem,nodecon)
+%
+%  where the required input is:
+%    elem          (numeric, element connectivity array (elems x nodes))
+%    nodecon       (numeric, node connectivity array (nodes x elems+1))
+%
+%  and the required output is:
+%    edgeper       (numeric, edge perimeter list (edgeper x 2))
+%    elemper       (numeric, element perimeter list (edgeper x 1))
+%    iloop         (numeric, index for each loop (nloop))
+%
+function [edgeper,elemper,iloop]=edgeperimeter(elem,nodecon)
+
+if ~nargin
+    help edgeperimeter
+    return
+end
+
+%%  create the edge adjacency array
+
+edgeadj=edgeadjacency(elem,nodecon);
+
+%%  create the unshared edge list
+
+[icol,irow]=find(edgeadj'==0);
+edgeuns=zeros(length(irow),2);
+elemuns=zeros(length(irow),1);
+
+%  loop over the edges
+
+for i=1:length(irow)
+    edgeuns(i,1)=elem(irow(i),icol(i));
+    edgeuns(i,2)=elem(irow(i),mod(icol(i),size(elem,2))+1);
+    elemuns(i)=irow(i);
+end
+
+%%  create the edge perimeter list
+
+edgeper=zeros(size(edgeuns));
+elemper=zeros(size(elemuns));
+iloop=[];
+ipt=0;
+
+%  find the beginning of a loop
+
+while ~isempty(find(edgeuns,1))
+    ipt=ipt+1;
+    iloop(end+1)=ipt;
+    [irow,icol]=find(edgeuns,1);
+    edgeper(ipt,:)=edgeuns(irow,:);
+    elemper(ipt)  =elemuns(irow);
+    edgeuns(irow,:)=[0 0];
+    elemuns(irow)  =0;
+    [irow,icol]=find(edgeuns==edgeper(ipt,2),1);
+
+%  continue following the loop
+
+    while ~isempty(irow)
+        ipt=ipt+1;
+        if (icol == 1)
+            edgeper(ipt,:)=edgeuns(irow,:);
+        else
+            edgeper(ipt,1)=edgeuns(irow,2);
+            edgeper(ipt,2)=edgeuns(irow,1);
+        end
+        elemper(ipt)  =elemuns(irow);
+        edgeuns(irow,:)=[0 0];
+        elemuns(irow)  =0;
+        [irow,icol]=find(edgeuns==edgeper(ipt,2),1);
+    end
+
+%  check to see if loop is closed
+
+    if (edgeper(iloop(end),1) ~= edgeper(ipt,2))
+        warning('Loop %d is not closed.\n',length(loop));
+    end
+end
+
+end
Index: /issm/trunk/src/m/kml/kml_mesh_write.m
===================================================================
--- /issm/trunk/src/m/kml/kml_mesh_write.m	(revision 6311)
+++ /issm/trunk/src/m/kml/kml_mesh_write.m	(revision 6312)
@@ -295,5 +295,11 @@
 if (~exist('prtplt','var') || strncmpi(prtplt,'on' ,2) || strncmpi(prtplt,'y',1)) && ...
     md.npart
-    [edgeadj,edgeuns,elemuns]=edgeadjacency(md.elements,md.nodeconnectivity);
+    [edgeadj]=edgeadjacency(md.elements,md.nodeconnectivity);
+    [icol,irow]=find(edgeadj'==0);
+    edgeuns=zeros(length(irow),2);
+    for i=1:length(irow)
+        edgeuns(i,1)=md.elements(irow(i),icol(i));
+        edgeuns(i,2)=md.elements(irow(i),mod(icol(i),size(md.elements,2))+1);
+    end
     fprintf(fid,'    <Folder>\n');
     fprintf(fid,'      <name>Unshared Edges</name>\n');
@@ -327,4 +333,65 @@
 end
 
+%  write folder for partitions
+
+fprintf(fid,'    <Folder>\n');
+fprintf(fid,'      <name>Partitions</name>\n');
+fprintf(fid,'      <visibility>1</visibility>\n');
+fprintf(fid,'      <description>Partitions=%d, Nodes=%d</description>\n',...
+    md.npart,md.numberofgrids);
+
+%  write each partition loop as a polygon
+
+disp(['Writing ' num2str(md.npart) ' partitions as KML polygons.']);
+epart=md.part(md.elements)+1;
+for k=1:md.npart
+    [icol,irow]=find(epart'==k);
+    irow=unique(irow);
+    elem=md.elements(irow,:);
+    nodecon=NodeConnectivity(elem,md.numberofgrids);
+    [edgeper,elemper,iloop]=edgeperimeter(elem,nodecon);
+    iloop(end+1)=size(edgeper,1)+1;
+    for i=1:length(iloop)-1
+        fprintf(fid,'      <Placemark>\n');
+        if (length(iloop)-1 > 1)
+            fprintf(fid,'        <name>Partition %d, Loop %d</name>\n',k,i);
+        else
+            fprintf(fid,'        <name>Partition %d</name>\n',k);
+        end
+        fprintf(fid,'        <visibility>1</visibility>\n');
+    %     if exist('edata','var')
+    %         fprintf(fid,'        <description>Element data: %g</description>\n',edata(i));
+    %         imap = fix((edata(i)-cmin)/(cmax-cmin)*size(cmap,1))+1;
+    %         if     (imap >= 1) && (imap <= size(cmap,1))
+    %             fprintf(fid,'        <styleUrl>#MatlabColor%d</styleUrl>\n',imap);
+    %         elseif (edata(i) == cmax)
+    %             fprintf(fid,'        <styleUrl>#MatlabColor%d</styleUrl>\n',size(cmap,1));
+    %         else
+    %             fprintf(fid,'        <styleUrl>#BlackLineEmptyPoly</styleUrl>\n');
+    %         end
+    %     else
+            fprintf(fid,'        <styleUrl>#BlackLineRandomPoly</styleUrl>\n');
+    %     end
+        fprintf(fid,'        <Polygon>\n');
+        fprintf(fid,'          <extrude>1</extrude>\n');
+        fprintf(fid,'          <altitudeMode>relativeToGround</altitudeMode>\n');
+        fprintf(fid,'          <outerBoundaryIs>\n');
+        fprintf(fid,'            <LinearRing>\n');
+        fprintf(fid,'              <coordinates>\n');
+        for j=iloop(i):iloop(i+1)-1
+            [lat(j),long(j)]=mapxy(md.x(edgeper(j,1)),md.y(edgeper(j,1)),'s');
+            fprintf(fid,'                %0.16g,%0.16g,%0.16g\n',long(j),lat(j),alt);
+        end
+        fprintf(fid,'                %0.16g,%0.16g,%0.16g\n',long(iloop(i)),lat(iloop(i)),alt);
+
+        fprintf(fid,'              </coordinates>\n');
+        fprintf(fid,'            </LinearRing>\n');
+        fprintf(fid,'          </outerBoundaryIs>\n');
+        fprintf(fid,'        </Polygon>\n');
+        fprintf(fid,'      </Placemark>\n');
+    end
+end
+fprintf(fid,'    </Folder>\n');
+
 %  write trailer data
 
