Index: /issm/trunk/src/m/partition/adjacency.m
===================================================================
--- /issm/trunk/src/m/partition/adjacency.m	(revision 3016)
+++ /issm/trunk/src/m/partition/adjacency.m	(revision 3016)
@@ -0,0 +1,24 @@
+function md=adjacency(md);
+%adjacency:  compute adjacency matrix, list of vertices and list of weights.
+%
+%  function to create the adjacency matrix from the connectivity table.
+%
+%  the required output is:
+%    md.adj_mat     (double [sparse nv x nv], vertex adjacency matrix)
+%    md.vwgt        (double [nv], vertex weights)
+
+
+
+indi=[md.elements(:,1);md.elements(:,2);md.elements(:,3)];
+indj=[md.elements(:,2);md.elements(:,3);md.elements(:,1)];
+values=1;
+
+md.adjacency=sparse(indi,indj,values,md.numberofgrids,md.numberofgrids);
+md.adjacency=[md.adjacency | md.adjacency'];
+
+%now, build vwgt:
+areas=GetAreas(md.elements,md.x,md.y);
+connectivity=md.nodeconnectivity(:,1:end-1);
+pos=find(connectivity);
+connectivity(pos)=areas(connectivity(pos))/3;
+md.vwgt=sum(connectivity,2);
Index: /issm/trunk/src/m/partition/flagedges.m
===================================================================
--- /issm/trunk/src/m/partition/flagedges.m	(revision 3015)
+++ /issm/trunk/src/m/partition/flagedges.m	(revision 3016)
@@ -1,8 +1,8 @@
-function flags=flagedges(partition,adjacencymatrix);
+function [flags middles]=flagedges(x,y,partition,adjacencymatrix);
 %FLAGEDGES return a vector of boolean flags that indicate whether a node is on the edge of a partition.
 %          needs partition vector and adjacencymatrix in inputs.
 %
 %
-%         Usage: flags=flagedges(partition,adjacencymatrix);
+%         Usage: [flags middlegrids]=flagedges(x,y,partition,adjacencymatrix);
 %
 
@@ -12,4 +12,6 @@
 %initialize flags
 flags=zeros(numberofgrids,1);
+
+middles=zeros(0,2);
 
 %go through grids, and figure out which grid is connected to a grid belonging to another partition, flag it.
@@ -38,5 +40,8 @@
 		grids_on_edge=grids(index);
 		flags(grids_on_edge)=1;
-		%flags(i)=1; do not flag i, otherwise, edges are doubled, results in ugly plots.
+		flags(i)=1; 
+		for j=1:length(grids_on_edge),
+			middles(end+1,:)=[(x(grids_on_edge(j))+x(i))/2 (y(grids_on_edge(j))+y(i))/2];
+		end
 	end
 end
Index: /issm/trunk/src/m/partition/partitioner.m
===================================================================
--- /issm/trunk/src/m/partition/partitioner.m	(revision 3016)
+++ /issm/trunk/src/m/partition/partitioner.m	(revision 3016)
@@ -0,0 +1,63 @@
+function part=partitioner(md,varargin)
+%PARTITIONER - partition mesh 
+%
+%   List of options to partitioner: 
+%
+%   package: 'chaco', 'metis' or 'scotch'
+%   npart: number of partitions.
+%   weighting: 'on' or 'off': default off
+%   
+%   Usage:
+%      md.part=partitioner(md,'package','chaco','npart',100,'weighting','on');
+%
+
+
+%get options: 
+options=pairoptions(varargin{:});
+
+%set defaults
+options=addfielddefault(options,'package','chaco');
+options=addfielddefault(options,'npart',10);
+options=addfielddefault(options,'weighting','off');
+
+%get package: 
+package=getfieldvalue(options,'package');
+npart=getfieldvalue(options,'npart');
+
+if strcmpi(package,'chaco'),
+
+	%  default method (from chaco.m)
+	method=[1 1 0 0 1 1 50 0 .001 7654321];
+	method(1)=3;    %  global method (3=inertial (geometric))
+	method(6)=1;    %  ndims (1=bisection, 2=quadrisection, 3=octasection)
+	method(3)=1;    %  vertex weights (0=off, 1=on)
+
+	%are we using weights? 
+	if strcmpi(getfieldvalue(options,'weighting'),'on'),
+	
+		%  add integer scaled vertex weights into adjacency matrix for chaco (on diagonal)
+		adj_mat2=md.adjacency+sparse(1:size(md.adjacency,1),1:size(md.adjacency,2),floor(md.vwgt/min(md.vwgt)));
+	
+		%  partition into nparts
+		part=chaco(adj_mat2,[md.x md.y],method,npart)'; 
+	else
+		%  partition into nparts
+		method(3)=0;    %  vertex weights (0=off, 1=on)
+		part=chaco(md.adjacency,[md.x md.y],method,npart)'; 
+	end
+	part=part+1; %index partitions from 1 up. like metis.
+
+elseif strcmpi(package,'scotch'),
+
+	error(['partitioner error message: ''scotch'' partitioner not supported yet!']);
+
+elseif strcmpi(package,'metis'),
+
+	[element_partitioning,part]=MeshPartition(md,npart);
+
+else
+
+	error(['partitioner error message: could not find ' package ' partitioner']);
+	help partitioner
+
+end
