Index: /issm/trunk-jpl/src/c/matlab/io/MatlabMatrixToDoubleMatrix.cpp
===================================================================
--- /issm/trunk-jpl/src/c/matlab/io/MatlabMatrixToDoubleMatrix.cpp	(revision 12445)
+++ /issm/trunk-jpl/src/c/matlab/io/MatlabMatrixToDoubleMatrix.cpp	(revision 12446)
@@ -39,5 +39,5 @@
 		
 		if(rows*cols){
-			matrix=xNewInit<double>(rows*cols,0.0);
+			matrix=xNewZeroInit<double>(rows*cols);
 
 			/*Now, get ir,jc and pr: */
@@ -64,5 +64,5 @@
 		/*Create serial matrix: */
 		if(rows*cols){
-			matrix=xNewInit<double>(rows*cols,0.0);
+			matrix=xNewZeroInit<double>(rows*cols);
 
 			for(i=0;i<rows;i++){
@@ -81,5 +81,5 @@
 		/*Create serial matrix: */
 		if(rows*cols){
-			matrix=xNewInit<double>(rows*cols,0.0);
+			matrix=xNewZeroInit<double>(rows*cols);
 
 			for(i=0;i<rows;i++){
@@ -98,5 +98,5 @@
 		/*Create serial matrix: */
 		if(rows*cols){
-			matrix=xNewInit<double>(rows*cols,0.0);
+			matrix=xNewZeroInit<double>(rows*cols);
 
 			for(i=0;i<rows;i++){
Index: /issm/trunk-jpl/src/c/matlab/io/MatlabNArrayToNArray.cpp
===================================================================
--- /issm/trunk-jpl/src/c/matlab/io/MatlabNArrayToNArray.cpp	(revision 12445)
+++ /issm/trunk-jpl/src/c/matlab/io/MatlabNArrayToNArray.cpp	(revision 12446)
@@ -51,5 +51,5 @@
 		nz=(int)((double)nnz/(double)rows);
 
-		matrix=xNewInit<double>(rows*cols,0.0);
+		matrix=xNewZeroInit<double>(rows*cols);
 
 		/*Now, get ir,jc and pr: */
@@ -74,5 +74,5 @@
 		
 		/*Create serial matrix: */
-		matrix=xNewInit<double>(numel,0.0);
+		matrix=xNewZeroInit<double>(numel);
 
 		dims=xNew<int>(ndims);
@@ -131,5 +131,5 @@
 		nz=(int)((double)nnz/(double)rows);
 
-		matrix=xNewInit<bool>(rows*cols,false);
+		matrix=xNewZeroInit<bool>(rows*cols);
 
 		/*Now, get ir,jc and pm: */
Index: /issm/trunk-jpl/src/c/matlab/io/MatlabVectorToDoubleVector.cpp
===================================================================
--- /issm/trunk-jpl/src/c/matlab/io/MatlabVectorToDoubleVector.cpp	(revision 12445)
+++ /issm/trunk-jpl/src/c/matlab/io/MatlabVectorToDoubleVector.cpp	(revision 12446)
@@ -51,5 +51,5 @@
 
 		if(rows){
-			vector=xNewInit<double>(rows,0.0);
+			vector=xNewZeroInit<double>(rows);
 
 			/*Now, get ir,jc and pr: */
Index: /issm/trunk-jpl/src/c/modules/KMLMeshWritex/KMLMeshWritex.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/KMLMeshWritex/KMLMeshWritex.cpp	(revision 12445)
+++ /issm/trunk-jpl/src/c/modules/KMLMeshWritex/KMLMeshWritex.cpp	(revision 12446)
@@ -120,5 +120,5 @@
 		_printf_(true,"Creating the node connectivity table.\n");
 		nncon=mxepg+1;
-		nodecon=xNewInit<int>(mncon*nncon,0);
+		nodecon=xNewZeroInit<int>(mncon*nncon);
 		ncfree=true;
 
@@ -150,5 +150,5 @@
 		else if (mdata == mncon) {
 			_printf_(true,"Averaging nodal data to element data.\n");
-			edata=xNewInit<double>(melem*ndata,0);
+			edata=xNewZeroInit<double>(melem*ndata);
 			edfree=true;
 
Index: /issm/trunk-jpl/src/c/modules/Krigingx/pKrigingx.cpp
===================================================================
--- /issm/trunk-jpl/src/c/modules/Krigingx/pKrigingx.cpp	(revision 12445)
+++ /issm/trunk-jpl/src/c/modules/Krigingx/pKrigingx.cpp	(revision 12446)
@@ -37,6 +37,6 @@
 
 	/*Allocate output*/
-	predictions =xNewInit<double>(n_interp,0.0);
-	error       =xNewInit<double>(n_interp,0.0);
+	predictions =xNewZeroInit<double>(n_interp);
+	error       =xNewZeroInit<double>(n_interp);
 
 	/*Get output*/
Index: /issm/trunk-jpl/src/c/objects/DakotaPlugin.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/DakotaPlugin.cpp	(revision 12445)
+++ /issm/trunk-jpl/src/c/objects/DakotaPlugin.cpp	(revision 12446)
@@ -85,5 +85,5 @@
 
 	/*Initialize responses: */
-	responses=xNewInit<IssmDouble>(numFns,0.0);
+	responses=xNewZeroInit<IssmDouble>(numFns);
 
 	/*run core solution: */
Index: /issm/trunk-jpl/src/c/objects/Numerics/ElementMatrix.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/Numerics/ElementMatrix.cpp	(revision 12445)
+++ /issm/trunk-jpl/src/c/objects/Numerics/ElementMatrix.cpp	(revision 12446)
@@ -101,5 +101,5 @@
 	/*Gset and values*/
 	this->gglobaldoflist=xNew<int>(this->nrows);
-	this->values=xNewInit<double>(this->nrows*this->ncols,0.0);
+	this->values=xNewZeroInit<double>(this->nrows*this->ncols);
 	for(i=0;i<Ke1->nrows;i++){
 		for(j=0;j<Ke1->ncols;j++){
@@ -205,5 +205,5 @@
 
 	/*fill values with 0: */
-	this->values=xNewInit<double>(this->nrows*this->ncols,0.0);
+	this->values=xNewZeroInit<double>(this->nrows*this->ncols);
 
 	/*g list*/
Index: /issm/trunk-jpl/src/c/objects/Numerics/ElementVector.cpp
===================================================================
--- /issm/trunk-jpl/src/c/objects/Numerics/ElementVector.cpp	(revision 12445)
+++ /issm/trunk-jpl/src/c/objects/Numerics/ElementVector.cpp	(revision 12446)
@@ -75,5 +75,5 @@
 	/*Gset and values*/
 	this->gglobaldoflist=xNew<int>(this->nrows);
-	this->values=xNewInit<double>(this->nrows,0.0);
+	this->values=xNewZeroInit<double>(this->nrows);
 	for(i=0;i<pe1->nrows;i++){
 		this->values[i] += pe1->values[i];
@@ -138,5 +138,5 @@
 
 	/*fill values with 0: */
-	this->values=xNewInit<double>(this->nrows,0.0);
+	this->values=xNewZeroInit<double>(this->nrows);
 	
 	/*g list*/
Index: /issm/trunk-jpl/src/c/shared/Alloc/xNewDelete.h
===================================================================
--- /issm/trunk-jpl/src/c/shared/Alloc/xNewDelete.h	(revision 12445)
+++ /issm/trunk-jpl/src/c/shared/Alloc/xNewDelete.h	(revision 12446)
@@ -8,26 +8,69 @@
 #include <cassert>
 
+
+// memory management of types 
+// T with non-trivial constructors require 
+// C++ style memory management
+#define USE_CXX_MEMORY_MANAGMENT_FOR_NON_POD_TYPES
+// but for speed on may alternatively use C memory managment
+// but can do so safely only for T that are at most 
+// plain old data structures (POD)
+#ifndef USE_CXX_MEMORY_MANAGMENT_FOR_NON_POD_TYPES
+#include <cstdlib>
+#endif 
+
 template <class T> 
 T* xNew(unsigned int size) {
+#ifdef USE_CXX_MEMORY_MANAGMENT_FOR_NON_POD_TYPES
   T* aT_p=new T[size];
   assert(aT_p);
   return aT_p;
-};
+#else
+  T* aT_p=(T*)malloc(size*sizeof(T));
+  assert(aT_p);
+  return aT_p;
+#endif  
+}
 
 template <class T> 
-T* xNewInit(unsigned int size, const T initVal) {
-  T* aT_p=new T[size];
+T* xNewZeroInit(unsigned int size) {
+#ifdef USE_CXX_MEMORY_MANAGMENT_FOR_NON_POD_TYPES
+  T* aT_p=xNew<T>(size);
+  for (unsigned int i=0; i<size;++i) 
+    aT_p[i]=(T)0;
+  return aT_p;
+#else
+  T* aT_p=(T*)calloc(size,sizeof(T));
   assert(aT_p);
-  for (int i=0; i<size;++i) 
-    aT_p[i]=initVal;
   return aT_p;
-};
+#endif
+}
 
 template <class T>
 void xDelete(T*& aT_p) { 
   if (aT_p) 
+#ifdef USE_CXX_MEMORY_MANAGMENT_FOR_NON_POD_TYPES
     delete []aT_p;
+#else
+    free((void*)aT_p);
+#endif
   aT_p=0;
-};
+}
+
+template <class T> 
+T* xReNew(T* old, unsigned int size) {
+#ifdef USE_CXX_MEMORY_MANAGMENT_FOR_NON_POD_TYPES
+  assert(old);
+  T* aT_p=xNew<T>(size);
+  for (unsigned int i=0; i<size;++i) 
+    aT_p[i]=old[i];
+  xDelete<T>(old);
+  return aT_p;
+#else 
+  T* aT_p=(T*)realloc((void*)old,size*sizeof(T));
+  assert(aT_p);
+  return aT_p;
+#endif 
+}
 
 #endif
Index: /issm/trunk-jpl/src/c/shared/TriMesh/SplitMeshForRifts.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/TriMesh/SplitMeshForRifts.cpp	(revision 12445)
+++ /issm/trunk-jpl/src/c/shared/TriMesh/SplitMeshForRifts.cpp	(revision 12446)
@@ -52,5 +52,5 @@
 
 	/*Go through all nodes of the rift segments, and start splitting the mesh: */
-	flags=xNewInit<int>(nods,0); //to make sure we don't split the same nodes twice!
+	flags=xNewZeroInit<int>(nods); //to make sure we don't split the same nodes twice!
 	for (i=0;i<nriftsegs;i++){
 		for (j=0;j<2;j++){
Index: /issm/trunk-jpl/src/c/shared/TriMesh/TriMeshUtils.cpp
===================================================================
--- /issm/trunk-jpl/src/c/shared/TriMesh/TriMeshUtils.cpp	(revision 12445)
+++ /issm/trunk-jpl/src/c/shared/TriMesh/TriMeshUtils.cpp	(revision 12446)
@@ -66,5 +66,5 @@
 				else{
 					/*Reallocate another max_number_elements slots in the GridElements: */
-					GridElementsRealloc=(int*)xrealloc(GridElements,(current_size+max_number_elements)*sizeof(int));
+					GridElementsRealloc=xReNew<int>(GridElements,(current_size+max_number_elements));
 					if (!GridElementsRealloc){
 						noerr=0;
@@ -129,5 +129,5 @@
 
 	/*Allocate segmentflags: */
-	riftsegments_uncompressed=xNewInit<int>(nsegs*5,0);
+	riftsegments_uncompressed=xNewZeroInit<int>(nsegs*5);
 
 	/*Find the segments that belong to a rift: they are the ones that see two elements. The other ones belong to a boundary 
@@ -905,5 +905,5 @@
 
 		/*allocate riftpenaltypairs, and riftnumpenaltypairs: */
-		if((numsegs/2-1)!=0)riftpenaltypairs=xNewInit<double>((numsegs/2-1)*RIFTPENALTYPAIRSWIDTH,0.0);
+		if((numsegs/2-1)!=0)riftpenaltypairs=xNewZeroInit<double>((numsegs/2-1)*RIFTPENALTYPAIRSWIDTH);
 		
 		/*Go through only one flank of the rifts, not counting the tips: */
Index: /issm/trunk-jpl/src/c/toolkits/issm/SeqMat.cpp
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/issm/SeqMat.cpp	(revision 12445)
+++ /issm/trunk-jpl/src/c/toolkits/issm/SeqMat.cpp	(revision 12446)
@@ -33,5 +33,5 @@
 	this->N=pN;
 	this->matrix=NULL;
-	if(M*N) this->matrix=xNewInit<double>(pM*pN,0.0);
+	if(M*N) this->matrix=xNewZeroInit<double>(pM*pN);
 }
 /*}}}*/
@@ -42,5 +42,5 @@
 	this->N=pN;
 	this->matrix=NULL;
-	if(M*N) this->matrix=xNewInit<double>(pM*pN,0.0);
+	if(M*N) this->matrix=xNewZeroInit<double>(pM*pN);
 }
 /*}}}*/
@@ -54,5 +54,5 @@
 	this->matrix=NULL;
 	if(M*N){
-		this->matrix=xNewInit<double>(pM*pN,0.0);
+		this->matrix=xNewZeroInit<double>(pM*pN);
 		memcpy(this->matrix,serial_mat,pM*pN*sizeof(double));
 	}
@@ -66,5 +66,5 @@
 	this->N=pN;
 	this->matrix=NULL;
-	if(M*N) this->matrix=xNewInit<double>(pM*pN,0.0);
+	if(M*N) this->matrix=xNewZeroInit<double>(pM*pN);
 }
 /*}}}*/
Index: /issm/trunk-jpl/src/c/toolkits/issm/SeqVec.cpp
===================================================================
--- /issm/trunk-jpl/src/c/toolkits/issm/SeqVec.cpp	(revision 12445)
+++ /issm/trunk-jpl/src/c/toolkits/issm/SeqVec.cpp	(revision 12446)
@@ -31,5 +31,5 @@
 	this->M=pM;
 	this->vector=NULL;
-	if(this->M) this->vector=xNewInit<double>(pM,0.0);
+	if(this->M) this->vector=xNewZeroInit<double>(pM);
 }
 /*}}}*/
@@ -42,5 +42,5 @@
 	this->vector=NULL;
 	if(this->M){
-		this->vector=xNewInit<double>(pM,0.0);
+		this->vector=xNewZeroInit<double>(pM);
 		memcpy(this->vector,buffer,pM*sizeof(double));
 	}
