Index: /issm/trunk/src/m/kml/kml_mesh_elem.m
===================================================================
--- /issm/trunk/src/m/kml/kml_mesh_elem.m	(revision 7341)
+++ /issm/trunk/src/m/kml/kml_mesh_elem.m	(revision 7342)
@@ -11,4 +11,5 @@
 %
 %  and the optional input is:
+%    latsgn        (numeric, +1/-1 for north/south latitude)
 %    data          (numeric, element or nodal results data)
 %    alt           (numeric, altitude for polygons, default 10000)
@@ -43,5 +44,5 @@
     if ischar(varargin{iarg})
         if ~isempty(strmatch(varargin{iarg},...
-                {'data','alt',...
+                {'latsgn','data','alt',...
                  'cmin','cmax','cmap'},...
                 'exact'))
@@ -58,4 +59,16 @@
     end
     iarg=iarg+2;
+end
+
+if isempty(md.lat)  || ((numel(md.lat) == 1)  && isnan(md.lat)) || ...
+   isempty(md.long) || ((numel(md.long) == 1) && isnan(md.long))
+    if     ~exist('latsgn')
+        error(['Missing ''latsgn'' parameter to calculate missing lat/long data.']);
+    elseif (abs(latsgn) ~= 1)
+        error(['Incorrect latsgn=' num2str(latsgn) ' parameter to calculate missing lat/long data.']);
+    else
+        display('Converting x/y data to lat/long data.');
+        [md.lat,md.long]=xy2ll(md.x,md.y,latsgn);
+    end
 end
 
@@ -143,6 +156,5 @@
 
     for j=1:size(md.elements,2)
-        [lat,long]=xy2ll(md.x(md.elements(i,j)),md.y(md.elements(i,j)),-1);
-        kring.coords(j,:)=[long lat alt];
+        kring.coords(j,:)=[md.long(md.elements(i,j)) md.lat(md.elements(i,j)) alt];
     end
     kring.coords(end,:)=kring.coords(1,:);
Index: /issm/trunk/src/m/kml/kml_mesh_write.m
===================================================================
--- /issm/trunk/src/m/kml/kml_mesh_write.m	(revision 7341)
+++ /issm/trunk/src/m/kml/kml_mesh_write.m	(revision 7342)
@@ -12,4 +12,5 @@
 %
 %  and the optional input is:
+%    lats          (numeric, +1/-1 for north/south latitude)
 %    data          (numeric, element or nodal results data)
 %    alt           (numeric, altitude for polygons, default 10000)
@@ -49,5 +50,5 @@
     if ischar(varargin{iarg})
         if ~isempty(strmatch(varargin{iarg},...
-                {'data','alt','lwidth','popac',...
+                {'latsgn','data','alt','lwidth','popac',...
                  'cmin','cmax','cmap','prtplt'},...
                 'exact'))
@@ -64,4 +65,16 @@
     end
     iarg=iarg+2;
+end
+
+if isempty(md.lat)  || ((numel(md.lat) == 1)  && isnan(md.lat)) || ...
+   isempty(md.long) || ((numel(md.long) == 1) && isnan(md.long))
+    if     ~exist('latsgn')
+        error(['Missing ''latsgn'' parameter to calculate missing lat/long data.']);
+    elseif (abs(latsgn) ~= 1)
+        error(['Incorrect latsgn=' num2str(latsgn) ' parameter to calculate missing lat/long data.']);
+    else
+        display('Converting x/y data to lat/long data.');
+        [md.lat,md.long]=xy2ll(md.x,md.y,latsgn);
+    end
 end
 
Index: /issm/trunk/src/m/kml/kml_part_edges.m
===================================================================
--- /issm/trunk/src/m/kml/kml_part_edges.m	(revision 7341)
+++ /issm/trunk/src/m/kml/kml_part_edges.m	(revision 7342)
@@ -11,4 +11,5 @@
 %
 %  and the optional input is:
+%    latsgn        (numeric, +1/-1 for north/south latitude)
 %    data          (numeric, element or nodal results data)
 %    alt           (numeric, altitude for polygons, default 10000)
@@ -44,5 +45,5 @@
     if ischar(varargin{iarg})
         if ~isempty(strmatch(varargin{iarg},...
-                {'data','alt',...
+                {'latsgn','data','alt',...
                  'cmin','cmax','cmap','prtplt'},...
                 'exact'))
@@ -59,4 +60,16 @@
     end
     iarg=iarg+2;
+end
+
+if isempty(md.lat)  || ((numel(md.lat) == 1)  && isnan(md.lat)) || ...
+   isempty(md.long) || ((numel(md.long) == 1) && isnan(md.long))
+    if     ~exist('latsgn')
+        error(['Missing ''latsgn'' parameter to calculate missing lat/long data.']);
+    elseif (abs(latsgn) ~= 1)
+        error(['Incorrect latsgn=' num2str(latsgn) ' parameter to calculate missing lat/long data.']);
+    else
+        display('Converting x/y data to lat/long data.');
+        [md.lat,md.long]=xy2ll(md.x,md.y,latsgn);
+    end
 end
 
@@ -221,9 +234,7 @@
 %  if first edge, write out first node
                     if ~elast
-                        [lat,long]=xy2ll(md.x(edgeper(j,1)),md.y(edgeper(j,1)),-1);
-                        kline.coords(end+1,:)=[long lat alt];
+                        kline.coords(end+1,:)=[md.long(edgeper(j,1)) md.lat(edgeper(j,1)) alt];
                     end
-                    [lat,long]=xy2ll(md.x(edgeper(j,2)),md.y(edgeper(j,2)),-1);
-                    kline.coords(end+1,:)=[long lat alt];
+                    kline.coords(end+1,:)=[md.long(edgeper(j,2)) md.lat(edgeper(j,2)) alt];
                     elast=elemper(j);
                     nlast=edgeper(j,2);
@@ -312,16 +323,14 @@
 %  write out first node of first side for half-edge to midpoint
 %                                disp(['segment j=' int2str(j) ' unshared half edge from node ' int2str(elemp(ielem,nlast)) ' (node ' int2str(nlast) ') on side ' int2str(slast) ' from element ' int2str(ielem) ' written.'])
-                                [lat,long]=xy2ll((md.x(elemp(ielem,nlast))),...
-                                                 (md.y(elemp(ielem,nlast))),-1);
-                                kline.coords(end+1,:)=[long lat alt];
+                                kline.coords(end+1,:)=[md.long(elemp(ielem,nlast)) ...
+                                                       md.lat(elemp(ielem,nlast)) alt];
                             end
                             nlast=0;
                             
 %  write out midpoint of first side
-                            [lat,long]=xy2ll((md.x(elemp(ielem,slast))...
-                                             +md.x(elemp(ielem,mod(slast,3)+1)))/2.,...
-                                             (md.y(elemp(ielem,slast))...
-                                             +md.y(elemp(ielem,mod(slast,3)+1)))/2.,-1);
-                            kline.coords(end+1,:)=[long lat alt];
+                            kline.coords(end+1,:)=[(md.long(elemp(ielem,slast))...
+                                                   +md.long(elemp(ielem,mod(slast,3)+1)))/2. ...
+                                                   (md.lat(elemp(ielem,slast))...
+                                                   +md.lat(elemp(ielem,mod(slast,3)+1)))/2. alt];
                         end
 
@@ -362,9 +371,8 @@
 %  write out half-edge from current node to midpoint of unshared side
 %                            disp(['segment j=' int2str(j) ' unshared half edge from node ' int2str(elemp(ielem,nlast)) ' (node ' int2str(nlast) ') on side ' int2str(slast) ' from element ' int2str(ielem) ' written.'])
-                            [lat,long]=xy2ll((md.x(elemp(ielem,nlast))...
-                                             +md.x(elemp(ielem,nnext)))/2.,...
-                                             (md.y(elemp(ielem,nlast))...
-                                             +md.y(elemp(ielem,nnext)))/2.,-1);
-                            kline.coords(end+1,:)=[long lat alt];
+                            kline.coords(end+1,:)=[(md.long(elemp(ielem,nlast))...
+                                                   +md.long(elemp(ielem,nnext)))/2. ...
+                                                   (md.lat(elemp(ielem,nlast))...
+                                                   +md.lat(elemp(ielem,nnext)))/2. alt];
                             nlast=0;
 
@@ -396,7 +404,6 @@
 %  all different, so cut through centroid
 %                                disp(['element ielem=' int2str(ielem) ' centroid written.'])
-                                [lat,long]=xy2ll(sum(md.x(elemp(ielem,:)))/3.,...
-                                                 sum(md.y(elemp(ielem,:)))/3.,-1);
-                                kline.coords(end+1,:)=[long lat alt];
+                                kline.coords(end+1,:)=[sum(md.long(elemp(ielem,:)))/3. ...
+                                                       sum(md.lat(elemp(ielem,:)))/3. alt];
                             end
 %  one node is in current partition, so cut off other two nodes
@@ -412,9 +419,8 @@
 %  write out midpoint of opposite side
 %                        disp(['segment j=' int2str(j) ' internal edge from side ' int2str(slast) ' to side ' int2str(snext) ' from element ' int2str(ielem) ' written.'])
-                        [lat,long]=xy2ll((md.x(elemp(ielem,snext))...
-                                         +md.x(elemp(ielem,mod(snext,3)+1)))/2.,...
-                                         (md.y(elemp(ielem,snext))...
-                                         +md.y(elemp(ielem,mod(snext,3)+1)))/2.,-1);
-                        kline.coords(end+1,:)=[long lat alt];
+                        kline.coords(end+1,:)=[(md.long(elemp(ielem,snext))...
+                                               +md.long(elemp(ielem,mod(snext,3)+1)))/2. ...
+                                               (md.lat(elemp(ielem,snext))...
+                                               +md.lat(elemp(ielem,mod(snext,3)+1)))/2. alt];
                         elast=ielem;
                         nlast=0;
@@ -445,7 +451,6 @@
                             end
 %                            disp(['segment j=' int2str(j) ' unshared half edge on side ' int2str(slast) ' to node ' int2str(elemp(elast,nnext)) ' (node ' int2str(nnext) ') from element ' int2str(elast) ' written.'])
-                            [lat,long]=xy2ll(md.x(elemp(elast,nnext)),...
-                                             md.y(elemp(elast,nnext)),-1);
-                            kline.coords(end+1,:)=[long lat alt];
+                            kline.coords(end+1,:)=[md.long(elemp(elast,nnext)) ...
+                                                   md.lat(elemp(elast,nnext)) alt];
                             break
 %  if not unshared, advance perimeter list and watch for end
Index: /issm/trunk/src/m/kml/kml_part_elems.m
===================================================================
--- /issm/trunk/src/m/kml/kml_part_elems.m	(revision 7341)
+++ /issm/trunk/src/m/kml/kml_part_elems.m	(revision 7342)
@@ -11,4 +11,5 @@
 %
 %  and the optional input is:
+%    latsgn        (numeric, +1/-1 for north/south latitude)
 %    data          (numeric, element or nodal results data)
 %    alt           (numeric, altitude for polygons, default 10000)
@@ -44,5 +45,5 @@
     if ischar(varargin{iarg})
         if ~isempty(strmatch(varargin{iarg},...
-                {'data','alt',...
+                {'latsgn','data','alt',...
                  'cmin','cmax','cmap','prtplt'},...
                 'exact'))
@@ -59,4 +60,16 @@
     end
     iarg=iarg+2;
+end
+
+if isempty(md.lat)  || ((numel(md.lat) == 1)  && isnan(md.lat)) || ...
+   isempty(md.long) || ((numel(md.long) == 1) && isnan(md.long))
+    if     ~exist('latsgn')
+        error(['Missing ''latsgn'' parameter to calculate missing lat/long data.']);
+    elseif (abs(latsgn) ~= 1)
+        error(['Incorrect latsgn=' num2str(latsgn) ' parameter to calculate missing lat/long data.']);
+    else
+        display('Converting x/y data to lat/long data.');
+        [md.lat,md.long]=xy2ll(md.x,md.y,latsgn);
+    end
 end
 
@@ -186,6 +199,5 @@
 
             for j=1:size(elem,2)
-                [lat,long]=xy2ll(md.x(elem(i,j)),md.y(elem(i,j)),-1);
-                kring.coords(j,:)=[long lat alt];
+                kring.coords(j,:)=[md.long(elem(i,j)) md.lat(elem(i,j)) alt];
             end
             kring.coords(end,:)=kring.coords(1,:);
Index: /issm/trunk/src/m/kml/kml_part_flagedges.m
===================================================================
--- /issm/trunk/src/m/kml/kml_part_flagedges.m	(revision 7341)
+++ /issm/trunk/src/m/kml/kml_part_flagedges.m	(revision 7342)
@@ -11,4 +11,5 @@
 %
 %  and the optional input is:
+%    latsgn        (numeric, +1/-1 for north/south latitude)
 %    alt           (numeric, altitude for polygons, default 10000)
 %    prtplt        (char, 'off'/'no' for partition edge plot)
@@ -40,5 +41,5 @@
     if ischar(varargin{iarg})
         if ~isempty(strmatch(varargin{iarg},...
-                {'alt','prtplt'},...
+                {'latsgn','alt','prtplt'},...
                 'exact'))
             eval([varargin{iarg} '=varargin{iarg+1};']);
@@ -53,4 +54,16 @@
 end
 
+if isempty(md.lat)  || ((numel(md.lat) == 1)  && isnan(md.lat)) || ...
+   isempty(md.long) || ((numel(md.long) == 1) && isnan(md.long))
+    if     ~exist('latsgn')
+        error(['Missing ''latsgn'' parameter to calculate missing lat/long data.']);
+    elseif (abs(latsgn) ~= 1)
+        error(['Incorrect latsgn=' num2str(latsgn) ' parameter to calculate missing lat/long data.']);
+    else
+        display('Converting x/y data to lat/long data.');
+        [md.lat,md.long]=xy2ll(md.x,md.y,latsgn);
+    end
+end
+
 if ~exist('alt','var')
     alt=10000;
@@ -61,16 +74,16 @@
 if (~exist('prtplt','var') || strncmpi(prtplt,'on' ,2) || strncmpi(prtplt,'y',1)) && ...
     md.npart
-    [xseg,yseg]=flagedges(md.elements,md.x,md.y,md.part);
+    [latseg,lonseg]=flagedges(md.elements,md.lat,md.long,md.part);
     kfold=kml_folder();
     kfold.name      ='Partition Segments';
     kfold.visibility=1;
     kfold.descript  =sprintf('Partitions=%d, Segments=%d',...
-        md.npart,size(xseg,1));
-    kfold.feature   ={repmat(kml_placemark(),1,size(xseg,1))};
+        md.npart,size(latseg,1));
+    kfold.feature   ={repmat(kml_placemark(),1,size(latseg,1))};
 
 %  write each segment as a linestring placemark
 
-    disp(['Writing ' num2str(size(xseg,1)) ' partition segments as KML linestrings.']);
-    for i=1:size(xseg,1)
+    disp(['Writing ' num2str(size(latseg,1)) ' partition segments as KML linestrings.']);
+    for i=1:size(latseg,1)
         kplace=kml_placemark();
         kplace.name      =sprintf('Segment %d',i);
@@ -85,6 +98,5 @@
 
         for j=1:2
-            [lat,long]=xy2ll(xseg(i,j),yseg(i,j),-1);
-            kline.coords(j,:)=[long lat alt];
+            kline.coords(j,:)=[lonseg(i,j) latseg(i,j) alt];
         end
 
Index: /issm/trunk/src/m/kml/kml_partitions.m
===================================================================
--- /issm/trunk/src/m/kml/kml_partitions.m	(revision 7341)
+++ /issm/trunk/src/m/kml/kml_partitions.m	(revision 7342)
@@ -12,4 +12,5 @@
 %
 %  and the optional input is:
+%    latsgn        (numeric, +1/-1 for north/south latitude)
 %    data          (numeric, element or nodal results data)
 %    alt           (numeric, altitude for polygons, default 10000)
@@ -45,5 +46,5 @@
     if ischar(varargin{iarg})
         if ~isempty(strmatch(varargin{iarg},...
-                {'data','alt',...
+                {'latsgn','data','alt',...
                  'cmin','cmax','cmap','prtplt'},...
                 'exact'))
@@ -60,4 +61,16 @@
     end
     iarg=iarg+2;
+end
+
+if isempty(md.lat)  || ((numel(md.lat) == 1)  && isnan(md.lat)) || ...
+   isempty(md.long) || ((numel(md.long) == 1) && isnan(md.long))
+    if     ~exist('latsgn')
+        error(['Missing ''latsgn'' parameter to calculate missing lat/long data.']);
+    elseif (abs(latsgn) ~= 1)
+        error(['Incorrect latsgn=' num2str(latsgn) ' parameter to calculate missing lat/long data.']);
+    else
+        display('Converting x/y data to lat/long data.');
+        [md.lat,md.long]=xy2ll(md.x,md.y,latsgn);
+    end
 end
 
@@ -223,9 +236,7 @@
 %  if first edge, write out first node
                     if ~elast
-                        [lat,long]=xy2ll(md.x(edgeper(j,1)),md.y(edgeper(j,1)),-1);
-                        kring.coords(end+1,:)=[long lat alt];
+                        kring.coords(end+1,:)=[md.long(edgeper(j,1)) md.lat(edgeper(j,1)) alt];
                     end
-                    [lat,long]=xy2ll(md.x(edgeper(j,2)),md.y(edgeper(j,2)),-1);
-                    kring.coords(end+1,:)=[long lat alt];
+                    kring.coords(end+1,:)=[md.long(edgeper(j,2)) md.lat(edgeper(j,2)) alt];
                     elast=elemper(j);
                     nlast=edgeper(j,2);
@@ -314,16 +325,14 @@
 %  write out first node of first side for half-edge to midpoint
 %                                disp(['segment j=' int2str(j) ' unshared half edge from node ' int2str(elemp(ielem,nlast)) ' (node ' int2str(nlast) ') on side ' int2str(slast) ' from element ' int2str(ielem) ' written.'])
-                                [lat,long]=xy2ll((md.x(elemp(ielem,nlast))),...
-                                                 (md.y(elemp(ielem,nlast))),-1);
-                                kring.coords(end+1,:)=[long lat alt];
+                                kring.coords(end+1,:)=[md.long(elemp(ielem,nlast)) ...
+                                                       md.lat(elemp(ielem,nlast)) alt];
                             end
                             nlast=0;
                             
 %  write out midpoint of first side
-                            [lat,long]=xy2ll((md.x(elemp(ielem,slast))...
-                                             +md.x(elemp(ielem,mod(slast,3)+1)))/2.,...
-                                             (md.y(elemp(ielem,slast))...
-                                             +md.y(elemp(ielem,mod(slast,3)+1)))/2.,-1);
-                            kring.coords(end+1,:)=[long lat alt];
+                            kring.coords(end+1,:)=[(md.long(elemp(ielem,slast))...
+                                                   +md.long(elemp(ielem,mod(slast,3)+1)))/2. ...
+                                                   (md.lat(elemp(ielem,slast))...
+                                                   +md.lat(elemp(ielem,mod(slast,3)+1)))/2. alt];
                         end
 
@@ -364,9 +373,8 @@
 %  write out half-edge from current node to midpoint of unshared side
 %                            disp(['segment j=' int2str(j) ' unshared half edge from node ' int2str(elemp(ielem,nlast)) ' (node ' int2str(nlast) ') on side ' int2str(slast) ' from element ' int2str(ielem) ' written.'])
-                            [lat,long]=xy2ll((md.x(elemp(ielem,nlast))...
-                                             +md.x(elemp(ielem,nnext)))/2.,...
-                                             (md.y(elemp(ielem,nlast))...
-                                             +md.y(elemp(ielem,nnext)))/2.,-1);
-                            kring.coords(end+1,:)=[long lat alt];
+                            kring.coords(end+1,:)=[(md.long(elemp(ielem,nlast))...
+                                                   +md.long(elemp(ielem,nnext)))/2. ...
+                                                   (md.lat(elemp(ielem,nlast))...
+                                                   +md.lat(elemp(ielem,nnext)))/2. alt];
                             nlast=0;
 
@@ -398,7 +406,6 @@
 %  all different, so cut through centroid
 %                                disp(['element ielem=' int2str(ielem) ' centroid written.'])
-                                [lat,long]=xy2ll(sum(md.x(elemp(ielem,:)))/3.,...
-                                                 sum(md.y(elemp(ielem,:)))/3.,-1);
-                                kring.coords(end+1,:)=[long lat alt];
+                                kring.coords(end+1,:)=[sum(md.long(elemp(ielem,:)))/3. ...
+                                                       sum(md.lat(elemp(ielem,:)))/3. alt];
                             end
 %  one node is in current partition, so cut off other two nodes
@@ -414,9 +421,8 @@
 %  write out midpoint of opposite side
 %                        disp(['segment j=' int2str(j) ' internal edge from side ' int2str(slast) ' to side ' int2str(snext) ' from element ' int2str(ielem) ' written.'])
-                        [lat,long]=xy2ll((md.x(elemp(ielem,snext))...
-                                         +md.x(elemp(ielem,mod(snext,3)+1)))/2.,...
-                                         (md.y(elemp(ielem,snext))...
-                                         +md.y(elemp(ielem,mod(snext,3)+1)))/2.,-1);
-                        kring.coords(end+1,:)=[long lat alt];
+                        kring.coords(end+1,:)=[(md.long(elemp(ielem,snext))...
+                                               +md.long(elemp(ielem,mod(snext,3)+1)))/2. ...
+                                               (md.lat(elemp(ielem,snext))...
+                                               +md.lat(elemp(ielem,mod(snext,3)+1)))/2. alt];
                         elast=ielem;
                         nlast=0;
@@ -447,7 +453,6 @@
                             end
 %                            disp(['segment j=' int2str(j) ' unshared half edge on side ' int2str(slast) ' to node ' int2str(elemp(elast,nnext)) ' (node ' int2str(nnext) ') from element ' int2str(elast) ' written.'])
-                            [lat,long]=xy2ll(md.x(elemp(elast,nnext)),...
-                                             md.y(elemp(elast,nnext)),-1);
-                            kring.coords(end+1,:)=[long lat alt];
+                            kring.coords(end+1,:)=[md.long(elemp(elast,nnext)) ...
+                                                   md.lat(elemp(elast,nnext)) alt];
                             break
 %  if not unshared, advance perimeter list and watch for end
Index: /issm/trunk/src/m/kml/kml_unsh_edges.m
===================================================================
--- /issm/trunk/src/m/kml/kml_unsh_edges.m	(revision 7341)
+++ /issm/trunk/src/m/kml/kml_unsh_edges.m	(revision 7342)
@@ -11,4 +11,5 @@
 %
 %  and the optional input is:
+%    latsgn        (numeric, +1/-1 for north/south latitude)
 %    alt           (numeric, altitude for polygons, default 10000)
 %    prtplt        (char, 'off'/'no' for partition edge plot)
@@ -40,5 +41,5 @@
     if ischar(varargin{iarg})
         if ~isempty(strmatch(varargin{iarg},...
-                {'alt','prtplt'},...
+                {'latsgn','alt','prtplt'},...
                 'exact'))
             eval([varargin{iarg} '=varargin{iarg+1};']);
@@ -51,4 +52,16 @@
     end
     iarg=iarg+2;
+end
+
+if isempty(md.lat)  || ((numel(md.lat) == 1)  && isnan(md.lat)) || ...
+   isempty(md.long) || ((numel(md.long) == 1) && isnan(md.long))
+    if     ~exist('latsgn')
+        error(['Missing ''latsgn'' parameter to calculate missing lat/long data.']);
+    elseif (abs(latsgn) ~= 1)
+        error(['Incorrect latsgn=' num2str(latsgn) ' parameter to calculate missing lat/long data.']);
+    else
+        display('Converting x/y data to lat/long data.');
+        [md.lat,md.long]=xy2ll(md.x,md.y,latsgn);
+    end
 end
 
@@ -91,6 +104,5 @@
 
         for j=1:2
-            [lat,long]=xy2ll(md.x(edgeuns(i,j)),md.y(edgeuns(i,j)),-1);
-            kline.coords(j,:)=[long lat alt];
+            kline.coords(j,:)=[md.long(edgeuns(i,j)) md.lat(edgeuns(i,j)) alt];
         end
 
