Index: /issm/trunk/src/c/modules/KMLMeshWritex/KMLMeshWritex.cpp
===================================================================
--- /issm/trunk/src/c/modules/KMLMeshWritex/KMLMeshWritex.cpp	(revision 7659)
+++ /issm/trunk/src/c/modules/KMLMeshWritex/KMLMeshWritex.cpp	(revision 7660)
@@ -19,9 +19,12 @@
 				   FILE* fid){
 
-	int     i,j,k,ipt=0,jpt=0;
+	int     i,j,k,ipt=0,jpt=0,nnodes;
+	int     mxepg=25;
 	int     lwidth=1;
 	double  popac=0.50;
 	char    indent[81]="  ";
 	double* edata=NULL;
+	bool    ncfree=false,
+			edfree=false;
 	KML_Document*  kdoc=NULL;
 	KML_Style*     kstyle;
@@ -112,27 +115,65 @@
 //	kdoc->DeepEcho();
 
-/*  average nodal data to element data, if necessary  */
+/*  create the node connectivity table, if necessary
+	(noting that rows do not need to be sorted, since the elements
+	are consecutively numbered)  */
+
+	if (!nodecon) {
+		_printf_(true,"Creating the node connectivity table.\n");
+		nncon=mxepg+1;
+		nodecon=(int *) xcalloc(mncon*nncon,sizeof(int));
+		ncfree=true;
+
+		jpt=0;
+		for (i=0; i<melem; i++) {
+			for (j=0; j<nelem; j++) {
+				if (elem[jpt]) {
+					ipt=(elem[jpt]-1)*nncon;
+					if (nodecon[ipt+(nncon-1)] < mxepg) {
+						nodecon[ipt+nodecon[ipt+(nncon-1)]]=i+1;
+						nodecon[ipt+(nncon-1)]++;
+					}
+					else
+						_error_("Nodal connectivity table needs more than specified %d columns.\n",mxepg);
+				}
+				jpt++;
+			}
+		}
+	}
+
+/*  average nodal data to element data, if necessary
+	(noting that multiple columns of data are handled here, but not
+	yet below)  */
 
 	if (data) {
 		if      (mdata == melem)
 			edata=data;
+
 		else if (mdata == mncon) {
 			_printf_(true,"Averaging nodal data to element data.\n");
 			edata=(double *) xcalloc(melem*ndata,sizeof(double));
+			edfree=true;
+
 			ipt=0;
 			jpt=0;
 			for (i=0; i<melem; i++) {
+				nnodes=0;
 				for (j=0; j<nelem; j++) {
-					for (k=0; k<ndata; k++)
-						edata[ipt+k]+=data[(elem[jpt]-1)*ndata+k];
+					if (elem[jpt]) {
+						for (k=0; k<ndata; k++)
+							edata[ipt+k]+=data[(elem[jpt]-1)*ndata+k];
+						nnodes++;
+					}
 					jpt++;
 				}
-				for (k=0; k<ndata; k++)
-					edata[ipt+k]/=(double)nelem;
+				if (nnodes)
+					for (k=0; k<ndata; k++)
+						edata[ipt+k]/=(double)nnodes;
 				ipt+=ndata;
 			}
 		}
+
 		else
-			_error_("Data has incorrect number of %d rows.\n",mdata);
+			_error_("Data matrix has incorrect number of %d rows.\n",mdata);
 	}
 
@@ -145,5 +186,6 @@
 														cmap,mcmap,ncmap));
 
-	if (mdata == mncon) xfree((void**)&edata);
+	if (edfree) xfree((void**)&edata);
+	if (ncfree) xfree((void**)&nodecon);
 	clock0a=clock();
 	time0a =time(NULL);
@@ -187,5 +229,5 @@
 	double  alt=10000;
 	double  cmin= DBL_MAX,
-		    cmax=-DBL_MAX;
+			cmax=-DBL_MAX;
 	int     imap;
 	KML_Folder*     kfold =NULL;
