Index: /issm/trunk-jpl/src/m/qmu/helpers.py
===================================================================
--- /issm/trunk-jpl/src/m/qmu/helpers.py	(revision 23099)
+++ /issm/trunk-jpl/src/m/qmu/helpers.py	(revision 23100)
@@ -1,4 +1,5 @@
 import numpy as np
 from collections import OrderedDict
+from copy import deepcopy
 
 class struct(object):
@@ -179,4 +180,24 @@
 		for a,b in zip(self._k,self._v):
 			yield(a,b)
+
+	def __copy__(self):
+		# shallow copy, hard copies of trivial attributes,
+		# references to structures like lists/OrderedDicts
+		# unless redefined as an entirely different structure
+		newInstance = type(self)()
+		for k,v in self.items():
+			exec('newInstance.%s = v')%(k)
+		return newInstance
+
+	def __deepcopy__(self,memo=None):
+		# hard copy of all attributes
+		# same thing but call deepcopy recursively
+		# technically not how it should be done,
+		# (see https://docs.python.org/2/library/copy.html#copy.deepcopy )
+		# but will generally work in this case
+		newInstance = type(self)()
+		for k,v in self.items():
+			exec('newInstance.%s = deepcopy(v)')%(k)
+		return newInstance
 
 	def iterkeys(self):
