Bug fixes to do with array sizes.

Incorporated eldads outer product code
This commit is contained in:
Rowan Cockett
2013-07-19 11:24:14 -07:00
parent c9dc29bf89
commit f626cedfb8
6 changed files with 96 additions and 104 deletions
+22 -22
View File
@@ -22,15 +22,16 @@ class TensorMesh(BaseMesh, TensorView, DiffOperators):
"""
def __init__(self, h, x0=None):
super(TensorMesh, self).__init__(np.array([len(x) for x in h]), x0)
super(TensorMesh, self).__init__(np.array([x.size for x in h]), x0)
assert len(h) == len(self.x0), "Dimension mismatch. x0 != len(h)"
for i, h_i in enumerate(h):
assert type(h_i) == np.ndarray, ("h[%i] is not a numpy array." % i)
assert len(h_i.shape) == 1, ("h[%i] must be a 1D numpy array." % i)
# Ensure h contains 1D vectors
self._h = [x.ravel() for x in h]
self._h = [mkvc(x) for x in h]
def h():
doc = "h is a list containing the cell widths of the tensor mesh in each dimension."
@@ -193,17 +194,16 @@ class TensorMesh(BaseMesh, TensorView, DiffOperators):
def fget(self):
if(self._vol is None):
vh = [mkvc(x, 2) for x in self.h]
vh = self.h
# Compute cell volumes
if(self.dim == 1):
self._vol = mkvc(vh[0])
elif(self.dim == 2):
# Cell sizes in each direction
self._vol = mkvc(vh[0]*vh[1].T)
self._vol = mkvc(np.outer(vh[0], vh[1]))
elif(self.dim == 3):
# Cell sizes in each direction
v12 = vh[0]*vh[1].T
self._vol = mkvc(mkvc(v12, 2)*vh[2].T)
self._vol = mkvc(np.outer(mkvc(np.outer(vh[0], vh[1])), vh[2]))
return self._vol
return locals()
_vol = None
@@ -215,20 +215,20 @@ class TensorMesh(BaseMesh, TensorView, DiffOperators):
def fget(self):
if(self._area is None):
# Ensure that we are working with column vectors
vh = [mkvc(x, 2) for x in self.h]
vh = self.h
# The number of cell centers in each direction
n = [x.size for x in self.h]
n = self.n
# Compute areas of cell faces
if(self.dim == 1):
self._area = np.ones((n[0]+1, 1))
self._area = np.ones(n[0]+1)
elif(self.dim == 2):
area1 = np.ones((n[0]+1, 1))*vh[1].T
area2 = vh[0]*np.ones((n[1]+1, 1)).T
area1 = np.outer(np.ones(n[0]+1), vh[1])
area2 = np.outer(vh[0], np.ones(n[1]+1))
self._area = np.r_[mkvc(area1), mkvc(area2)]
elif(self.dim == 3):
area1 = np.ones((n[0]+1, 1))*mkvc(vh[1]*vh[2].T)
area2 = vh[0]*mkvc(np.ones((n[1]+1, 1))*vh[2].T)
area3 = vh[0]*mkvc(vh[1]*np.ones((n[2]+1, 1)).T)
area1 = np.outer(np.ones(n[0]+1), mkvc(np.outer(vh[1], vh[2])))
area2 = np.outer(vh[0], mkvc(np.outer(np.ones(n[1]+1), vh[2])))
area3 = np.outer(vh[0], mkvc(np.outer(vh[1], np.ones(n[2]+1))))
self._area = np.r_[mkvc(area1), mkvc(area2), mkvc(area3)]
return self._area
return locals()
@@ -239,22 +239,22 @@ class TensorMesh(BaseMesh, TensorView, DiffOperators):
doc = "Construct edge legnths of the 3D model as 1d array."
def fget(self):
if(self._area is None):
if(self._edge is None):
# Ensure that we are working with column vectors
vh = [mkvc(x, 2) for x in self.h]
vh = self.h
# The number of cell centers in each direction
n = [x.size for x in self.h]
n = self.n
# Compute edge lengths
if(self.dim == 1):
self._edge = mkvc(vh[0])
elif(self.dim == 2):
l1 = vh[0]*np.ones((n[1]+1, 1)).T
l2 = np.ones((n[0]+1, 1))*vh[1].T
l1 = np.outer(vh[0], np.ones(n[1]+1))
l2 = np.outer(np.ones(n[0]+1), vh[1])
self._edge = np.r_[mkvc(l1), mkvc(l2)]
elif(self.dim == 3):
l1 = vh[0]*mkvc(np.ones((n[1]+1, 1))*np.ones((n[2]+1, 1)).T)
l2 = np.ones((n[0]+1, 1))*mkvc(vh[1]*np.ones((n[2]+1, 1)).T)
l3 = np.ones((n[0]+1, 1))*mkvc(np.ones((n[1]+1, 1))*vh[2].T)
l1 = np.outer(vh[0], mkvc(np.outer(np.ones(n[1]+1), np.ones(n[2]+1))))
l2 = np.outer(np.ones(n[0]+1), mkvc(np.outer(vh[1], np.ones(n[2]+1))))
l3 = np.outer(np.ones(n[0]+1), mkvc(np.outer(np.ones(n[1]+1), vh[2])))
self._edge = np.r_[mkvc(l1), mkvc(l2), mkvc(l3)]
return self._edge
return locals()