From 0f703739ed1c475046c960b78d0da41028f5dfab Mon Sep 17 00:00:00 2001 From: Lindsey Date: Thu, 14 May 2015 14:12:52 -0700 Subject: [PATCH 1/3] Changes LRM to Curvilinear --- .../{LogicallyRectMesh.py => CurvilinearMesh.py} | 12 ++++++------ SimPEG/Mesh/__init__.py | 2 +- SimPEG/Tests/TestUtils.py | 6 +++--- ..._LogicallyRectMesh.py => test_CurvilinearMesh.py} | 6 +++--- SimPEG/Tests/test_innerProductDerivs.py | 4 ++-- docs/api_Mesh.rst | 4 ++-- docs/api_MeshCode.rst | 2 +- 7 files changed, 18 insertions(+), 18 deletions(-) rename SimPEG/Mesh/{LogicallyRectMesh.py => CurvilinearMesh.py} (98%) rename SimPEG/Tests/{test_LogicallyRectMesh.py => test_CurvilinearMesh.py} (97%) diff --git a/SimPEG/Mesh/LogicallyRectMesh.py b/SimPEG/Mesh/CurvilinearMesh.py similarity index 98% rename from SimPEG/Mesh/LogicallyRectMesh.py rename to SimPEG/Mesh/CurvilinearMesh.py index b2dc6f55..0fbf78a3 100644 --- a/SimPEG/Mesh/LogicallyRectMesh.py +++ b/SimPEG/Mesh/CurvilinearMesh.py @@ -10,9 +10,9 @@ normalize2D = lambda x: x/np.kron(np.ones((1, 2)), Utils.mkvc(length2D(x), 2)) normalize3D = lambda x: x/np.kron(np.ones((1, 3)), Utils.mkvc(length3D(x), 2)) -class LogicallyRectMesh(BaseRectangularMesh, DiffOperators, InnerProducts): +class CurvilinearMesh(BaseRectangularMesh, DiffOperators, InnerProducts): """ - LogicallyRectMesh is a mesh class that deals with logically rectangular meshes. + CurvilinearMesh is a mesh class that deals with logically rectangular meshes. Example of a logically rectangular mesh: @@ -21,7 +21,7 @@ class LogicallyRectMesh(BaseRectangularMesh, DiffOperators, InnerProducts): from SimPEG import Mesh, Utils X, Y = Utils.exampleLrmGrid([3,3],'rotate') - M = Mesh.LogicallyRectMesh([X, Y]) + M = Mesh.CurvilinearMesh([X, Y]) M.plotGrid(showIt=True) """ @@ -343,7 +343,7 @@ class LogicallyRectMesh(BaseRectangularMesh, DiffOperators, InnerProducts): from SimPEG import Mesh, Utils X, Y = Utils.exampleLrmGrid([3,3],'rotate') - M = Mesh.LogicallyRectMesh([X, Y]) + M = Mesh.CurvilinearMesh([X, Y]) M.plotGrid(showIt=True) """ @@ -435,9 +435,9 @@ if __name__ == '__main__': dee3 = True if dee3: X, Y, Z = Utils.ndgrid(h1, h2, h3, vector=False) - M = LogicallyRectMesh([X, Y, Z]) + M = CurvilinearMesh([X, Y, Z]) else: X, Y = Utils.ndgrid(h1, h2, vector=False) - M = LogicallyRectMesh([X, Y]) + M = CurvilinearMesh([X, Y]) print M.r(M.normals, 'F', 'Fx', 'V') diff --git a/SimPEG/Mesh/__init__.py b/SimPEG/Mesh/__init__.py index deb11321..9aadfcba 100644 --- a/SimPEG/Mesh/__init__.py +++ b/SimPEG/Mesh/__init__.py @@ -1,5 +1,5 @@ from TensorMesh import TensorMesh from CylMesh import CylMesh -from LogicallyRectMesh import LogicallyRectMesh +from CurvilinearMesh import CurvilinearMesh from TreeMesh import TreeMesh from BaseMesh import BaseMesh diff --git a/SimPEG/Tests/TestUtils.py b/SimPEG/Tests/TestUtils.py index dbcb92b6..57e17f06 100644 --- a/SimPEG/Tests/TestUtils.py +++ b/SimPEG/Tests/TestUtils.py @@ -3,7 +3,7 @@ import matplotlib.pyplot as plt from numpy.linalg import norm from SimPEG.Utils import mkvc, sdiag, diagEst from SimPEG import Utils -from SimPEG.Mesh import TensorMesh, LogicallyRectMesh, CylMesh +from SimPEG.Mesh import TensorMesh, CurvilinearMesh, CylMesh import numpy as np import scipy.sparse as sp import unittest @@ -126,10 +126,10 @@ class OrderTest(unittest.TestCase): raise Exception('Lom not supported for 1D') elif self.meshDimension == 2: X, Y = Utils.exampleLrmGrid([nc, nc], kwrd) - self.M = LogicallyRectMesh([X, Y]) + self.M = CurvilinearMesh([X, Y]) elif self.meshDimension == 3: X, Y, Z = Utils.exampleLrmGrid([nc, nc, nc], kwrd) - self.M = LogicallyRectMesh([X, Y, Z]) + self.M = CurvilinearMesh([X, Y, Z]) return 1./nc def getError(self): diff --git a/SimPEG/Tests/test_LogicallyRectMesh.py b/SimPEG/Tests/test_CurvilinearMesh.py similarity index 97% rename from SimPEG/Tests/test_LogicallyRectMesh.py rename to SimPEG/Tests/test_CurvilinearMesh.py index 5d223f68..132b6f03 100644 --- a/SimPEG/Tests/test_LogicallyRectMesh.py +++ b/SimPEG/Tests/test_CurvilinearMesh.py @@ -1,6 +1,6 @@ import numpy as np import unittest -from SimPEG.Mesh import TensorMesh, LogicallyRectMesh +from SimPEG.Mesh import TensorMesh, CurvilinearMesh from SimPEG.Utils import ndgrid @@ -13,10 +13,10 @@ class BasicLRMTests(unittest.TestCase): gridIt = lambda h: [np.cumsum(np.r_[0, x]) for x in h] X, Y = ndgrid(gridIt([a, b]), vector=False) self.TM2 = TensorMesh([a, b]) - self.LRM2 = LogicallyRectMesh([X, Y]) + self.LRM2 = CurvilinearMesh([X, Y]) X, Y, Z = ndgrid(gridIt([a, b, c]), vector=False) self.TM3 = TensorMesh([a, b, c]) - self.LRM3 = LogicallyRectMesh([X, Y, Z]) + self.LRM3 = CurvilinearMesh([X, Y, Z]) def test_area_3D(self): test_area = np.array([1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2]) diff --git a/SimPEG/Tests/test_innerProductDerivs.py b/SimPEG/Tests/test_innerProductDerivs.py index 4b7d63cd..27979445 100644 --- a/SimPEG/Tests/test_innerProductDerivs.py +++ b/SimPEG/Tests/test_innerProductDerivs.py @@ -9,7 +9,7 @@ class TestInnerProductsDerivs(unittest.TestCase): def doTestFace(self, h, rep, fast, meshType, invProp=False, invMat=False): if meshType == 'LRM': hRect = Utils.exampleLrmGrid(h,'rotate') - mesh = Mesh.LogicallyRectMesh(hRect) + mesh = Mesh.CurvilinearMesh(hRect) elif meshType == 'Tree': mesh = Mesh.TreeMesh(h) elif meshType == 'Tensor': @@ -26,7 +26,7 @@ class TestInnerProductsDerivs(unittest.TestCase): def doTestEdge(self, h, rep, fast, meshType, invProp=False, invMat=False): if meshType == 'LRM': hRect = Utils.exampleLrmGrid(h,'rotate') - mesh = Mesh.LogicallyRectMesh(hRect) + mesh = Mesh.CurvilinearMesh(hRect) elif meshType == 'Tree': mesh = Mesh.TreeMesh(h) elif meshType == 'Tensor': diff --git a/docs/api_Mesh.rst b/docs/api_Mesh.rst index c698cf67..7bf398b1 100644 --- a/docs/api_Mesh.rst +++ b/docs/api_Mesh.rst @@ -29,7 +29,7 @@ the implementations. tM = Mesh.TensorMesh(sz) qM = Mesh.TreeMesh(sz) qM.refine(lambda X: 1 if np.sqrt(((X-0.5)**2).sum()) < 0.3 else 0) - rM = Mesh.LogicallyRectMesh(Utils.meshutils.exampleLrmGrid(sz,'rotate')) + rM = Mesh.CurvilinearMesh(Utils.meshutils.exampleLrmGrid(sz,'rotate')) fig, axes = plt.subplots(1,3,figsize=(14,5)) opts = {} @@ -38,7 +38,7 @@ the implementations. qM.plotGrid(ax=axes[1], **opts) axes[1].set_title('TreeMesh') rM.plotGrid(ax=axes[2], **opts) - axes[2].set_title('LogicallyRectMesh') + axes[2].set_title('CurvilinearMesh') plt.show() diff --git a/docs/api_MeshCode.rst b/docs/api_MeshCode.rst index 13ceffba..9fb52e53 100644 --- a/docs/api_MeshCode.rst +++ b/docs/api_MeshCode.rst @@ -21,7 +21,7 @@ Tree Mesh Logically Rectangular Mesh ========================== -.. automodule:: SimPEG.Mesh.LogicallyRectMesh +.. automodule:: SimPEG.Mesh.Curvilinear :show-inheritance: :members: :undoc-members: From 46b2e11ef8d57c4312216acd014d2154e525accb Mon Sep 17 00:00:00 2001 From: Lindsey Heagy Date: Thu, 14 May 2015 23:35:38 -0700 Subject: [PATCH 2/3] LRM --> Curv --- SimPEG/Mesh/CurvilinearMesh.py | 4 +- SimPEG/Mesh/InnerProducts.py | 16 ++-- SimPEG/Tests/TestUtils.py | 2 +- SimPEG/Tests/test_CurvilinearMesh.py | 104 ++++++++++----------- SimPEG/Tests/test_innerProduct.py | 4 +- SimPEG/Tests/test_innerProductDerivs.py | 116 ++++++++++++------------ SimPEG/Tests/test_operators.py | 6 +- docs/SimPEGFrameworkRevised.png | Bin 0 -> 31193 bytes docs/api_InnerProducts.rst | 4 +- docs/api_Utils.rst | 2 +- 10 files changed, 129 insertions(+), 129 deletions(-) create mode 100644 docs/SimPEGFrameworkRevised.png diff --git a/SimPEG/Mesh/CurvilinearMesh.py b/SimPEG/Mesh/CurvilinearMesh.py index 0fbf78a3..e4eeda3e 100644 --- a/SimPEG/Mesh/CurvilinearMesh.py +++ b/SimPEG/Mesh/CurvilinearMesh.py @@ -27,7 +27,7 @@ class CurvilinearMesh(BaseRectangularMesh, DiffOperators, InnerProducts): __metaclass__ = Utils.SimPEGMetaClass - _meshType = 'LRM' + _meshType = 'Curv' def __init__(self, nodes): assert type(nodes) == list, "'nodes' variable must be a list of np.ndarray" @@ -38,7 +38,7 @@ class CurvilinearMesh(BaseRectangularMesh, DiffOperators, InnerProducts): assert nodes_i.shape == nodes[0].shape, ("nodes[%i] is not the same shape as nodes[0]" % i) assert len(nodes[0].shape) == len(nodes), "Dimension mismatch" - assert len(nodes[0].shape) > 1, "Not worth using LRM for a 1D mesh." + assert len(nodes[0].shape) > 1, "Not worth using Curv for a 1D mesh." BaseRectangularMesh.__init__(self, np.array(nodes[0].shape)-1, None) diff --git a/SimPEG/Mesh/InnerProducts.py b/SimPEG/Mesh/InnerProducts.py index 2cf48a7c..42a08702 100644 --- a/SimPEG/Mesh/InnerProducts.py +++ b/SimPEG/Mesh/InnerProducts.py @@ -328,7 +328,7 @@ class InnerProducts(object): iijj = ndgrid(i, j) ii, jj = iijj[:, 0], iijj[:, 1] - if M._meshType == 'LRM': + if M._meshType == 'Curv': fN1 = M.r(M.normals, 'F', 'Fx', 'M') fN2 = M.r(M.normals, 'F', 'Fy', 'M') @@ -353,7 +353,7 @@ class InnerProducts(object): PXX = sp.csr_matrix((np.ones(2*M.nC), (range(2*M.nC), IND)), shape=(2*M.nC, M.nF)) - if M._meshType == 'LRM': + if M._meshType == 'Curv': I2x2 = inv2X2BlockDiagonal(getSubArray(fN1[0], [i + posFx, j]), getSubArray(fN1[1], [i + posFx, j]), getSubArray(fN2[0], [i, j + posFy]), getSubArray(fN2[1], [i, j + posFy])) PXX = I2x2 * PXX @@ -376,7 +376,7 @@ class InnerProducts(object): iijjkk = ndgrid(i, j, k) ii, jj, kk = iijjkk[:, 0], iijjkk[:, 1], iijjkk[:, 2] - if M._meshType == 'LRM': + if M._meshType == 'Curv': fN1 = M.r(M.normals, 'F', 'Fx', 'M') fN2 = M.r(M.normals, 'F', 'Fy', 'M') fN3 = M.r(M.normals, 'F', 'Fz', 'M') @@ -410,7 +410,7 @@ class InnerProducts(object): PXXX = sp.coo_matrix((np.ones(3*M.nC), (range(3*M.nC), IND)), shape=(3*M.nC, M.nF)).tocsr() - if M._meshType == 'LRM': + if M._meshType == 'Curv': I3x3 = inv3X3BlockDiagonal(getSubArray(fN1[0], [i + posX, j, k]), getSubArray(fN1[1], [i + posX, j, k]), getSubArray(fN1[2], [i + posX, j, k]), getSubArray(fN2[0], [i, j + posY, k]), getSubArray(fN2[1], [i, j + posY, k]), getSubArray(fN2[2], [i, j + posY, k]), getSubArray(fN3[0], [i, j, k + posZ]), getSubArray(fN3[1], [i, j, k + posZ]), getSubArray(fN3[2], [i, j, k + posZ])) @@ -432,7 +432,7 @@ class InnerProducts(object): iijj = ndgrid(i, j) ii, jj = iijj[:, 0], iijj[:, 1] - if M._meshType == 'LRM': + if M._meshType == 'Curv': eT1 = M.r(M.tangents, 'E', 'Ex', 'M') eT2 = M.r(M.tangents, 'E', 'Ey', 'M') @@ -452,7 +452,7 @@ class InnerProducts(object): PXX = sp.coo_matrix((np.ones(2*M.nC), (range(2*M.nC), IND)), shape=(2*M.nC, M.nE)).tocsr() - if M._meshType == 'LRM': + if M._meshType == 'Curv': I2x2 = inv2X2BlockDiagonal(getSubArray(eT1[0], [i, j + posX]), getSubArray(eT1[1], [i, j + posX]), getSubArray(eT2[0], [i + posY, j]), getSubArray(eT2[1], [i + posY, j])) PXX = I2x2 * PXX @@ -466,7 +466,7 @@ class InnerProducts(object): iijjkk = ndgrid(i, j, k) ii, jj, kk = iijjkk[:, 0], iijjkk[:, 1], iijjkk[:, 2] - if M._meshType == 'LRM': + if M._meshType == 'Curv': eT1 = M.r(M.tangents, 'E', 'Ex', 'M') eT2 = M.r(M.tangents, 'E', 'Ey', 'M') eT3 = M.r(M.tangents, 'E', 'Ez', 'M') @@ -495,7 +495,7 @@ class InnerProducts(object): PXXX = sp.coo_matrix((np.ones(3*M.nC), (range(3*M.nC), IND)), shape=(3*M.nC, M.nE)).tocsr() - if M._meshType == 'LRM': + if M._meshType == 'Curv': I3x3 = inv3X3BlockDiagonal(getSubArray(eT1[0], [i, j + posX[0], k + posX[1]]), getSubArray(eT1[1], [i, j + posX[0], k + posX[1]]), getSubArray(eT1[2], [i, j + posX[0], k + posX[1]]), getSubArray(eT2[0], [i + posY[0], j, k + posY[1]]), getSubArray(eT2[1], [i + posY[0], j, k + posY[1]]), getSubArray(eT2[2], [i + posY[0], j, k + posY[1]]), getSubArray(eT3[0], [i + posZ[0], j + posZ[1], k]), getSubArray(eT3[1], [i + posZ[0], j + posZ[1], k]), getSubArray(eT3[2], [i + posZ[0], j + posZ[1], k])) diff --git a/SimPEG/Tests/TestUtils.py b/SimPEG/Tests/TestUtils.py index 57e17f06..c6aa5bc4 100644 --- a/SimPEG/Tests/TestUtils.py +++ b/SimPEG/Tests/TestUtils.py @@ -115,7 +115,7 @@ class OrderTest(unittest.TestCase): max_h = max([np.max(hi) for hi in self.M.h]) return max_h - elif 'LRM' in self._meshType: + elif 'Curv' in self._meshType: if 'uniform' in self._meshType: kwrd = 'rect' elif 'rotate' in self._meshType: diff --git a/SimPEG/Tests/test_CurvilinearMesh.py b/SimPEG/Tests/test_CurvilinearMesh.py index 132b6f03..42e3d877 100644 --- a/SimPEG/Tests/test_CurvilinearMesh.py +++ b/SimPEG/Tests/test_CurvilinearMesh.py @@ -4,7 +4,7 @@ from SimPEG.Mesh import TensorMesh, CurvilinearMesh from SimPEG.Utils import ndgrid -class BasicLRMTests(unittest.TestCase): +class BasicCurvTests(unittest.TestCase): def setUp(self): a = np.array([1, 1, 1]) @@ -13,91 +13,91 @@ class BasicLRMTests(unittest.TestCase): gridIt = lambda h: [np.cumsum(np.r_[0, x]) for x in h] X, Y = ndgrid(gridIt([a, b]), vector=False) self.TM2 = TensorMesh([a, b]) - self.LRM2 = CurvilinearMesh([X, Y]) + self.Curv2 = CurvilinearMesh([X, Y]) X, Y, Z = ndgrid(gridIt([a, b, c]), vector=False) self.TM3 = TensorMesh([a, b, c]) - self.LRM3 = CurvilinearMesh([X, Y, Z]) + self.Curv3 = CurvilinearMesh([X, Y, Z]) def test_area_3D(self): test_area = np.array([1, 1, 1, 1, 2, 2, 2, 2, 4, 4, 4, 4, 8, 8, 8, 8, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2]) - self.assertTrue(np.all(self.LRM3.area == test_area)) + self.assertTrue(np.all(self.Curv3.area == test_area)) def test_vol_3D(self): test_vol = np.array([1, 1, 1, 2, 2, 2, 4, 4, 4, 8, 8, 8]) - np.testing.assert_almost_equal(self.LRM3.vol, test_vol) + np.testing.assert_almost_equal(self.Curv3.vol, test_vol) self.assertTrue(True) # Pass if you get past the assertion. def test_vol_2D(self): test_vol = np.array([1, 1, 1, 2, 2, 2]) - t1 = np.all(self.LRM2.vol == test_vol) + t1 = np.all(self.Curv2.vol == test_vol) self.assertTrue(t1) def test_edge_3D(self): test_edge = np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4]) - t1 = np.all(self.LRM3.edge == test_edge) + t1 = np.all(self.Curv3.edge == test_edge) self.assertTrue(t1) def test_edge_2D(self): test_edge = np.array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2]) - t1 = np.all(self.LRM2.edge == test_edge) + t1 = np.all(self.Curv2.edge == test_edge) self.assertTrue(t1) def test_tangents(self): - T = self.LRM2.tangents - self.assertTrue(np.all(self.LRM2.r(T, 'E', 'Ex', 'V')[0] == np.ones(self.LRM2.nEx))) - self.assertTrue(np.all(self.LRM2.r(T, 'E', 'Ex', 'V')[1] == np.zeros(self.LRM2.nEx))) - self.assertTrue(np.all(self.LRM2.r(T, 'E', 'Ey', 'V')[0] == np.zeros(self.LRM2.nEy))) - self.assertTrue(np.all(self.LRM2.r(T, 'E', 'Ey', 'V')[1] == np.ones(self.LRM2.nEy))) + T = self.Curv2.tangents + self.assertTrue(np.all(self.Curv2.r(T, 'E', 'Ex', 'V')[0] == np.ones(self.Curv2.nEx))) + self.assertTrue(np.all(self.Curv2.r(T, 'E', 'Ex', 'V')[1] == np.zeros(self.Curv2.nEx))) + self.assertTrue(np.all(self.Curv2.r(T, 'E', 'Ey', 'V')[0] == np.zeros(self.Curv2.nEy))) + self.assertTrue(np.all(self.Curv2.r(T, 'E', 'Ey', 'V')[1] == np.ones(self.Curv2.nEy))) - T = self.LRM3.tangents - self.assertTrue(np.all(self.LRM3.r(T, 'E', 'Ex', 'V')[0] == np.ones(self.LRM3.nEx))) - self.assertTrue(np.all(self.LRM3.r(T, 'E', 'Ex', 'V')[1] == np.zeros(self.LRM3.nEx))) - self.assertTrue(np.all(self.LRM3.r(T, 'E', 'Ex', 'V')[2] == np.zeros(self.LRM3.nEx))) + T = self.Curv3.tangents + self.assertTrue(np.all(self.Curv3.r(T, 'E', 'Ex', 'V')[0] == np.ones(self.Curv3.nEx))) + self.assertTrue(np.all(self.Curv3.r(T, 'E', 'Ex', 'V')[1] == np.zeros(self.Curv3.nEx))) + self.assertTrue(np.all(self.Curv3.r(T, 'E', 'Ex', 'V')[2] == np.zeros(self.Curv3.nEx))) - self.assertTrue(np.all(self.LRM3.r(T, 'E', 'Ey', 'V')[0] == np.zeros(self.LRM3.nEy))) - self.assertTrue(np.all(self.LRM3.r(T, 'E', 'Ey', 'V')[1] == np.ones(self.LRM3.nEy))) - self.assertTrue(np.all(self.LRM3.r(T, 'E', 'Ey', 'V')[2] == np.zeros(self.LRM3.nEy))) + self.assertTrue(np.all(self.Curv3.r(T, 'E', 'Ey', 'V')[0] == np.zeros(self.Curv3.nEy))) + self.assertTrue(np.all(self.Curv3.r(T, 'E', 'Ey', 'V')[1] == np.ones(self.Curv3.nEy))) + self.assertTrue(np.all(self.Curv3.r(T, 'E', 'Ey', 'V')[2] == np.zeros(self.Curv3.nEy))) - self.assertTrue(np.all(self.LRM3.r(T, 'E', 'Ez', 'V')[0] == np.zeros(self.LRM3.nEz))) - self.assertTrue(np.all(self.LRM3.r(T, 'E', 'Ez', 'V')[1] == np.zeros(self.LRM3.nEz))) - self.assertTrue(np.all(self.LRM3.r(T, 'E', 'Ez', 'V')[2] == np.ones(self.LRM3.nEz))) + self.assertTrue(np.all(self.Curv3.r(T, 'E', 'Ez', 'V')[0] == np.zeros(self.Curv3.nEz))) + self.assertTrue(np.all(self.Curv3.r(T, 'E', 'Ez', 'V')[1] == np.zeros(self.Curv3.nEz))) + self.assertTrue(np.all(self.Curv3.r(T, 'E', 'Ez', 'V')[2] == np.ones(self.Curv3.nEz))) def test_normals(self): - N = self.LRM2.normals - self.assertTrue(np.all(self.LRM2.r(N, 'F', 'Fx', 'V')[0] == np.ones(self.LRM2.nFx))) - self.assertTrue(np.all(self.LRM2.r(N, 'F', 'Fx', 'V')[1] == np.zeros(self.LRM2.nFx))) - self.assertTrue(np.all(self.LRM2.r(N, 'F', 'Fy', 'V')[0] == np.zeros(self.LRM2.nFy))) - self.assertTrue(np.all(self.LRM2.r(N, 'F', 'Fy', 'V')[1] == np.ones(self.LRM2.nFy))) + N = self.Curv2.normals + self.assertTrue(np.all(self.Curv2.r(N, 'F', 'Fx', 'V')[0] == np.ones(self.Curv2.nFx))) + self.assertTrue(np.all(self.Curv2.r(N, 'F', 'Fx', 'V')[1] == np.zeros(self.Curv2.nFx))) + self.assertTrue(np.all(self.Curv2.r(N, 'F', 'Fy', 'V')[0] == np.zeros(self.Curv2.nFy))) + self.assertTrue(np.all(self.Curv2.r(N, 'F', 'Fy', 'V')[1] == np.ones(self.Curv2.nFy))) - N = self.LRM3.normals - self.assertTrue(np.all(self.LRM3.r(N, 'F', 'Fx', 'V')[0] == np.ones(self.LRM3.nFx))) - self.assertTrue(np.all(self.LRM3.r(N, 'F', 'Fx', 'V')[1] == np.zeros(self.LRM3.nFx))) - self.assertTrue(np.all(self.LRM3.r(N, 'F', 'Fx', 'V')[2] == np.zeros(self.LRM3.nFx))) + N = self.Curv3.normals + self.assertTrue(np.all(self.Curv3.r(N, 'F', 'Fx', 'V')[0] == np.ones(self.Curv3.nFx))) + self.assertTrue(np.all(self.Curv3.r(N, 'F', 'Fx', 'V')[1] == np.zeros(self.Curv3.nFx))) + self.assertTrue(np.all(self.Curv3.r(N, 'F', 'Fx', 'V')[2] == np.zeros(self.Curv3.nFx))) - self.assertTrue(np.all(self.LRM3.r(N, 'F', 'Fy', 'V')[0] == np.zeros(self.LRM3.nFy))) - self.assertTrue(np.all(self.LRM3.r(N, 'F', 'Fy', 'V')[1] == np.ones(self.LRM3.nFy))) - self.assertTrue(np.all(self.LRM3.r(N, 'F', 'Fy', 'V')[2] == np.zeros(self.LRM3.nFy))) + self.assertTrue(np.all(self.Curv3.r(N, 'F', 'Fy', 'V')[0] == np.zeros(self.Curv3.nFy))) + self.assertTrue(np.all(self.Curv3.r(N, 'F', 'Fy', 'V')[1] == np.ones(self.Curv3.nFy))) + self.assertTrue(np.all(self.Curv3.r(N, 'F', 'Fy', 'V')[2] == np.zeros(self.Curv3.nFy))) - self.assertTrue(np.all(self.LRM3.r(N, 'F', 'Fz', 'V')[0] == np.zeros(self.LRM3.nFz))) - self.assertTrue(np.all(self.LRM3.r(N, 'F', 'Fz', 'V')[1] == np.zeros(self.LRM3.nFz))) - self.assertTrue(np.all(self.LRM3.r(N, 'F', 'Fz', 'V')[2] == np.ones(self.LRM3.nFz))) + self.assertTrue(np.all(self.Curv3.r(N, 'F', 'Fz', 'V')[0] == np.zeros(self.Curv3.nFz))) + self.assertTrue(np.all(self.Curv3.r(N, 'F', 'Fz', 'V')[1] == np.zeros(self.Curv3.nFz))) + self.assertTrue(np.all(self.Curv3.r(N, 'F', 'Fz', 'V')[2] == np.ones(self.Curv3.nFz))) def test_grid(self): - self.assertTrue(np.all(self.LRM2.gridCC == self.TM2.gridCC)) - self.assertTrue(np.all(self.LRM2.gridN == self.TM2.gridN)) - self.assertTrue(np.all(self.LRM2.gridFx == self.TM2.gridFx)) - self.assertTrue(np.all(self.LRM2.gridFy == self.TM2.gridFy)) - self.assertTrue(np.all(self.LRM2.gridEx == self.TM2.gridEx)) - self.assertTrue(np.all(self.LRM2.gridEy == self.TM2.gridEy)) + self.assertTrue(np.all(self.Curv2.gridCC == self.TM2.gridCC)) + self.assertTrue(np.all(self.Curv2.gridN == self.TM2.gridN)) + self.assertTrue(np.all(self.Curv2.gridFx == self.TM2.gridFx)) + self.assertTrue(np.all(self.Curv2.gridFy == self.TM2.gridFy)) + self.assertTrue(np.all(self.Curv2.gridEx == self.TM2.gridEx)) + self.assertTrue(np.all(self.Curv2.gridEy == self.TM2.gridEy)) - self.assertTrue(np.all(self.LRM3.gridCC == self.TM3.gridCC)) - self.assertTrue(np.all(self.LRM3.gridN == self.TM3.gridN)) - self.assertTrue(np.all(self.LRM3.gridFx == self.TM3.gridFx)) - self.assertTrue(np.all(self.LRM3.gridFy == self.TM3.gridFy)) - self.assertTrue(np.all(self.LRM3.gridFz == self.TM3.gridFz)) - self.assertTrue(np.all(self.LRM3.gridEx == self.TM3.gridEx)) - self.assertTrue(np.all(self.LRM3.gridEy == self.TM3.gridEy)) - self.assertTrue(np.all(self.LRM3.gridEz == self.TM3.gridEz)) + self.assertTrue(np.all(self.Curv3.gridCC == self.TM3.gridCC)) + self.assertTrue(np.all(self.Curv3.gridN == self.TM3.gridN)) + self.assertTrue(np.all(self.Curv3.gridFx == self.TM3.gridFx)) + self.assertTrue(np.all(self.Curv3.gridFy == self.TM3.gridFy)) + self.assertTrue(np.all(self.Curv3.gridFz == self.TM3.gridFz)) + self.assertTrue(np.all(self.Curv3.gridEx == self.TM3.gridEx)) + self.assertTrue(np.all(self.Curv3.gridEy == self.TM3.gridEy)) + self.assertTrue(np.all(self.Curv3.gridEz == self.TM3.gridEz)) if __name__ == '__main__': diff --git a/SimPEG/Tests/test_innerProduct.py b/SimPEG/Tests/test_innerProduct.py index bbaf4b14..0a5ff809 100644 --- a/SimPEG/Tests/test_innerProduct.py +++ b/SimPEG/Tests/test_innerProduct.py @@ -7,7 +7,7 @@ from SimPEG import Utils class TestInnerProducts(OrderTest): """Integrate an function over a unit cube domain using edgeInnerProducts and faceInnerProducts.""" - meshTypes = ['uniformTensorMesh', 'uniformLRM', 'rotateLRM'] + meshTypes = ['uniformTensorMesh', 'uniformCurv', 'rotateCurv'] meshDimension = 3 meshSizes = [16, 32] @@ -154,7 +154,7 @@ class TestInnerProducts(OrderTest): class TestInnerProducts2D(OrderTest): """Integrate an function over a unit cube domain using edgeInnerProducts and faceInnerProducts.""" - meshTypes = ['uniformTensorMesh', 'uniformLRM', 'rotateLRM'] + meshTypes = ['uniformTensorMesh', 'uniformCurv', 'rotateCurv'] meshDimension = 2 meshSizes = [4, 8, 16, 32, 64, 128] diff --git a/SimPEG/Tests/test_innerProductDerivs.py b/SimPEG/Tests/test_innerProductDerivs.py index 27979445..6eb561c1 100644 --- a/SimPEG/Tests/test_innerProductDerivs.py +++ b/SimPEG/Tests/test_innerProductDerivs.py @@ -7,7 +7,7 @@ from TestUtils import checkDerivative class TestInnerProductsDerivs(unittest.TestCase): def doTestFace(self, h, rep, fast, meshType, invProp=False, invMat=False): - if meshType == 'LRM': + if meshType == 'Curv': hRect = Utils.exampleLrmGrid(h,'rotate') mesh = Mesh.CurvilinearMesh(hRect) elif meshType == 'Tree': @@ -24,7 +24,7 @@ class TestInnerProductsDerivs(unittest.TestCase): return checkDerivative(fun, sig, num=5, plotIt=False) def doTestEdge(self, h, rep, fast, meshType, invProp=False, invMat=False): - if meshType == 'LRM': + if meshType == 'Curv': hRect = Utils.exampleLrmGrid(h,'rotate') mesh = Mesh.CurvilinearMesh(hRect) elif meshType == 'Tree': @@ -137,65 +137,65 @@ class TestInnerProductsDerivs(unittest.TestCase): - def test_FaceIP_2D_float_LRM(self): - self.assertTrue(self.doTestFace([10, 4],0, False, 'LRM')) - def test_FaceIP_3D_float_LRM(self): - self.assertTrue(self.doTestFace([10, 4, 5],0, False, 'LRM')) - def test_FaceIP_2D_isotropic_LRM(self): - self.assertTrue(self.doTestFace([10, 4],1, False, 'LRM')) - def test_FaceIP_3D_isotropic_LRM(self): - self.assertTrue(self.doTestFace([10, 4, 5],1, False, 'LRM')) - def test_FaceIP_2D_anisotropic_LRM(self): - self.assertTrue(self.doTestFace([10, 4],2, False, 'LRM')) - def test_FaceIP_3D_anisotropic_LRM(self): - self.assertTrue(self.doTestFace([10, 4, 5],3, False, 'LRM')) - def test_FaceIP_2D_tensor_LRM(self): - self.assertTrue(self.doTestFace([10, 4],3, False, 'LRM')) - def test_FaceIP_3D_tensor_LRM(self): - self.assertTrue(self.doTestFace([10, 4, 5],6, False, 'LRM')) + def test_FaceIP_2D_float_Curv(self): + self.assertTrue(self.doTestFace([10, 4],0, False, 'Curv')) + def test_FaceIP_3D_float_Curv(self): + self.assertTrue(self.doTestFace([10, 4, 5],0, False, 'Curv')) + def test_FaceIP_2D_isotropic_Curv(self): + self.assertTrue(self.doTestFace([10, 4],1, False, 'Curv')) + def test_FaceIP_3D_isotropic_Curv(self): + self.assertTrue(self.doTestFace([10, 4, 5],1, False, 'Curv')) + def test_FaceIP_2D_anisotropic_Curv(self): + self.assertTrue(self.doTestFace([10, 4],2, False, 'Curv')) + def test_FaceIP_3D_anisotropic_Curv(self): + self.assertTrue(self.doTestFace([10, 4, 5],3, False, 'Curv')) + def test_FaceIP_2D_tensor_Curv(self): + self.assertTrue(self.doTestFace([10, 4],3, False, 'Curv')) + def test_FaceIP_3D_tensor_Curv(self): + self.assertTrue(self.doTestFace([10, 4, 5],6, False, 'Curv')) - def test_FaceIP_2D_float_fast_LRM(self): - self.assertTrue(self.doTestFace([10, 4],0, True, 'LRM')) - def test_FaceIP_3D_float_fast_LRM(self): - self.assertTrue(self.doTestFace([10, 4, 5],0, True, 'LRM')) - def test_FaceIP_2D_isotropic_fast_LRM(self): - self.assertTrue(self.doTestFace([10, 4],1, True, 'LRM')) - def test_FaceIP_3D_isotropic_fast_LRM(self): - self.assertTrue(self.doTestFace([10, 4, 5],1, True, 'LRM')) - def test_FaceIP_2D_anisotropic_fast_LRM(self): - self.assertTrue(self.doTestFace([10, 4],2, True, 'LRM')) - def test_FaceIP_3D_anisotropic_fast_LRM(self): - self.assertTrue(self.doTestFace([10, 4, 5],3, True, 'LRM')) + def test_FaceIP_2D_float_fast_Curv(self): + self.assertTrue(self.doTestFace([10, 4],0, True, 'Curv')) + def test_FaceIP_3D_float_fast_Curv(self): + self.assertTrue(self.doTestFace([10, 4, 5],0, True, 'Curv')) + def test_FaceIP_2D_isotropic_fast_Curv(self): + self.assertTrue(self.doTestFace([10, 4],1, True, 'Curv')) + def test_FaceIP_3D_isotropic_fast_Curv(self): + self.assertTrue(self.doTestFace([10, 4, 5],1, True, 'Curv')) + def test_FaceIP_2D_anisotropic_fast_Curv(self): + self.assertTrue(self.doTestFace([10, 4],2, True, 'Curv')) + def test_FaceIP_3D_anisotropic_fast_Curv(self): + self.assertTrue(self.doTestFace([10, 4, 5],3, True, 'Curv')) - def test_EdgeIP_2D_float_LRM(self): - self.assertTrue(self.doTestEdge([10, 4],0, False, 'LRM')) - def test_EdgeIP_3D_float_LRM(self): - self.assertTrue(self.doTestEdge([10, 4, 5],0, False, 'LRM')) - def test_EdgeIP_2D_isotropic_LRM(self): - self.assertTrue(self.doTestEdge([10, 4],1, False, 'LRM')) - def test_EdgeIP_3D_isotropic_LRM(self): - self.assertTrue(self.doTestEdge([10, 4, 5],1, False, 'LRM')) - def test_EdgeIP_2D_anisotropic_LRM(self): - self.assertTrue(self.doTestEdge([10, 4],2, False, 'LRM')) - def test_EdgeIP_3D_anisotropic_LRM(self): - self.assertTrue(self.doTestEdge([10, 4, 5],3, False, 'LRM')) - def test_EdgeIP_2D_tensor_LRM(self): - self.assertTrue(self.doTestEdge([10, 4],3, False, 'LRM')) - def test_EdgeIP_3D_tensor_LRM(self): - self.assertTrue(self.doTestEdge([10, 4, 5],6, False, 'LRM')) + def test_EdgeIP_2D_float_Curv(self): + self.assertTrue(self.doTestEdge([10, 4],0, False, 'Curv')) + def test_EdgeIP_3D_float_Curv(self): + self.assertTrue(self.doTestEdge([10, 4, 5],0, False, 'Curv')) + def test_EdgeIP_2D_isotropic_Curv(self): + self.assertTrue(self.doTestEdge([10, 4],1, False, 'Curv')) + def test_EdgeIP_3D_isotropic_Curv(self): + self.assertTrue(self.doTestEdge([10, 4, 5],1, False, 'Curv')) + def test_EdgeIP_2D_anisotropic_Curv(self): + self.assertTrue(self.doTestEdge([10, 4],2, False, 'Curv')) + def test_EdgeIP_3D_anisotropic_Curv(self): + self.assertTrue(self.doTestEdge([10, 4, 5],3, False, 'Curv')) + def test_EdgeIP_2D_tensor_Curv(self): + self.assertTrue(self.doTestEdge([10, 4],3, False, 'Curv')) + def test_EdgeIP_3D_tensor_Curv(self): + self.assertTrue(self.doTestEdge([10, 4, 5],6, False, 'Curv')) - def test_EdgeIP_2D_float_fast_LRM(self): - self.assertTrue(self.doTestEdge([10, 4],0, True, 'LRM')) - def test_EdgeIP_3D_float_fast_LRM(self): - self.assertTrue(self.doTestEdge([10, 4, 5],0, True, 'LRM')) - def test_EdgeIP_2D_isotropic_fast_LRM(self): - self.assertTrue(self.doTestEdge([10, 4],1, True, 'LRM')) - def test_EdgeIP_3D_isotropic_fast_LRM(self): - self.assertTrue(self.doTestEdge([10, 4, 5],1, True, 'LRM')) - def test_EdgeIP_2D_anisotropic_fast_LRM(self): - self.assertTrue(self.doTestEdge([10, 4],2, True, 'LRM')) - def test_EdgeIP_3D_anisotropic_fast_LRM(self): - self.assertTrue(self.doTestEdge([10, 4, 5],3, True, 'LRM')) + def test_EdgeIP_2D_float_fast_Curv(self): + self.assertTrue(self.doTestEdge([10, 4],0, True, 'Curv')) + def test_EdgeIP_3D_float_fast_Curv(self): + self.assertTrue(self.doTestEdge([10, 4, 5],0, True, 'Curv')) + def test_EdgeIP_2D_isotropic_fast_Curv(self): + self.assertTrue(self.doTestEdge([10, 4],1, True, 'Curv')) + def test_EdgeIP_3D_isotropic_fast_Curv(self): + self.assertTrue(self.doTestEdge([10, 4, 5],1, True, 'Curv')) + def test_EdgeIP_2D_anisotropic_fast_Curv(self): + self.assertTrue(self.doTestEdge([10, 4],2, True, 'Curv')) + def test_EdgeIP_3D_anisotropic_fast_Curv(self): + self.assertTrue(self.doTestEdge([10, 4, 5],3, True, 'Curv')) diff --git a/SimPEG/Tests/test_operators.py b/SimPEG/Tests/test_operators.py index 9a465fcd..416689bc 100644 --- a/SimPEG/Tests/test_operators.py +++ b/SimPEG/Tests/test_operators.py @@ -4,7 +4,7 @@ from TestUtils import OrderTest import matplotlib.pyplot as plt #TODO: 'randomTensorMesh' -MESHTYPES = ['uniformTensorMesh', 'uniformLRM', 'rotateLRM'] +MESHTYPES = ['uniformTensorMesh', 'uniformCurv', 'rotateCurv'] call2 = lambda fun, xyz: fun(xyz[:, 0], xyz[:, 1]) call3 = lambda fun, xyz: fun(xyz[:, 0], xyz[:, 1], xyz[:, 2]) cart_row2 = lambda g, xfun, yfun: np.c_[call2(xfun, g), call2(yfun, g)] @@ -38,7 +38,7 @@ class TestCurl(OrderTest): curlE_ana = self.M.projectFaceVector(Fc) curlE = self.M.edgeCurl.dot(E) - if self._meshType == 'rotateLRM': + if self._meshType == 'rotateCurv': # Really it is the integration we should be caring about: # So, let us look at the l2 norm. err = np.linalg.norm(self.M.area*(curlE - curlE_ana), 2) @@ -229,7 +229,7 @@ class TestFaceDiv3D(OrderTest): divF = self.M.faceDiv.dot(F) divF_ana = call3(sol, self.M.gridCC) - if self._meshType == 'rotateLRM': + if self._meshType == 'rotateCurv': # Really it is the integration we should be caring about: # So, let us look at the l2 norm. err = np.linalg.norm(self.M.vol*(divF-divF_ana), 2) diff --git a/docs/SimPEGFrameworkRevised.png b/docs/SimPEGFrameworkRevised.png new file mode 100644 index 0000000000000000000000000000000000000000..18ce7a304d14227626f99c011d32873007b071bb GIT binary patch literal 31193 zcmc$GcT`hd({B7nfcAkK4JH??=l?aI0^!R z7}Qj6-v@yXVL%{A7ac9|jfKydG7!k`z1rC+cz&AzN(DlwP{M(dS9GeFz8DlfO$QaZZVbm`gnDHJ;DoR3TF&q zAE#GHY&;?=jsNb8Il>BE`bq-~0{&|lf3cBUDXWwFb5ut$#!)_M&AuDkstvT4*bP+h?0wx=zNdG4_>kGlKi}IU@gD}B1lMaZ zkIC$5xUb&7L(fycL&sHbARDr+=Q}n=Yz#eLpx7IpAROhckWHoPCcOFi4F6Xl;UJo= zX7>lWX*zy-N0%B;Qh%enOt+MK`VsY`tt#ABnKIbRS?8M&zug_)Y)M(o#0D&vS=Qv+ z$+4ASt*}Gk=1{F+C@)GeM^?9Bmp>4d93QcZdWSMOiVH1T%yxnv#UU)yTl-x6X?^*e zb~PUQVvt4KAZ*8rRR$xvrZoRhc_JZf0KHQhzwDt=?nKQY*obGLvY9 zLaDb0YN6|)cfqLmK2rP#F|%zyS9v)`h0SsEhtv1P&25{RHl_3(g~;U5YqNrO{~+ViMOd6n(;oguobtk<|km8FD&lebDeO6ZfSIFFtp5^ zJUo^!!#I{T5n!r{|2V%_iJ*6v$r$RH-!#@~U(EDE_U+jqyCa?z#wqf46W+yjW)e|0 z-F3;RntL9RPLCyOW75KPN}&U7E0y!c>7A3LJ44eiJl{OwFetgP8`IXT;;lUKtepX1 z`EoL(HX$?9>fBmD$LXuNBN_~()MGD?YYFhZIwxT$vRfP-8?DyoUrr2j9Q0_se(|k5 z?i_|UrZ}!7=%dQFOKwn}jm;smOONM^A$wQmiNbYkJ9YD=lFjA1bW7$e-KqJKhy+M2 z`;I(HuhC_LH)=j=Uxjw@8>QG))ik;v8hm?_txBQvXVjpXcbv<4V8a5mzUOY9>pw(-gbB2s6n6|as8 zVxB0NI#<5ECuH{ygq6&+mWpk=50_H%VBEORH{6TD^^5Gvv|6Zny~zB)@j+g%bpGMa z;=|9ByOQk+3`YV==4iI8%Ik^<+h@UKQ;#6S5uM>mbGjv!j*{U!V*q_1c0TZ!{o88O zNfBxCt_T!X?oo7Wy6@PPs=??Z?~E+$ znVQS@WZ!_0$EC+^LH2Sj5hjfhp%UEs;>4b09Ny0D{D+~<)nw8&l0w$xRDE2#uYP8g zFk^C1RJmI5=@>d>mKToqKHS!1eGQcmrkm(UX5#IBtYh3WGahK^)=YG2H+Jfv} zKkhhxpfSX@87RBu+ddHDd~E;aj^=E)je=RSOR<^6)nF)-CSYv+RQrVIT@Qiq&sJkPuFa2;eZ&u zOAH}L&(ttjxqnn?o1>ZgmPqHS$LP8)vZkago5zDsI?)W{g6w^nGE#27@%tjiZSvN7 z>gK5D$H(JL1V7Yh^{;K2_C~+Ea4=v5ub#!cqZ`pYXWBVyDu1ZfxU^%YZ13TbuX#4k zMXbN}5;c-!d6Pp+v@-+sA&Ms;rklr?ZpUpg7nE8&#)GVo zq(*BN{4r7V@=Mn(Teza&TSVTVbMHjZJJ2D3Dcig7d_oX9ctFgA4|D&RTKHt73#plx(#7F7E z^Er8u%CP63XQdT#RxQcVkUbPrkG=P-&o4ZU9kPVjRvUQztdmbE^n%dC-T2NqHOO&* zfK+a92y;uEAeyRS3v5R=J?X&$(4l(NJJ79V&7A`0#Ci9fB4^b(rFQ?S2TuH!yV1c@1`(HCf_DsCZ%=poAY-CyHJcU9 zJVe?Xt9#Un%a6>%BnuUL_|VBlMKU3?r5X%=hCD8#E^is11;sTePJdnC>;9bB7Z}?I z>vO}s2ts_JwL~TJubajEC{*GC6i=AjZRN`mVa1DXQBqeHZ3z9V{2y5duXmp6CW$yr z_-hP}??`oTC}b|+j_u;sO-3hkcLRr4sHzI;f~Vi6{srx8E(pHA)}YHOzVZA1asMaj zt9zxCDWr|_UMs9}9ZMmgjo6gv_=1^~=-j-=5ryQ&4#geAVLe-=AW9Bw*`JI+l0!$$ z=jr!{@C8f9E^lk9E-6|B)=f8`KDhH$Dfefgt+ivW^BWu1#|{QI3`VANrptiIw)qsx zVQJsLZePHXH%5pB$Ci>*uTcp~b?eMLwl8+jSqu$3^()L_0gnI4-48 zcA!FPD|XEIM*iJ7fd0z&w-14u^x+kc8@nLTz?);E8aS6X_l6=bVl;$AmOvn}3qL?` zR%ZNaUFDB(hq}c4?H~zyL#TrHbe-1>WD|ZpeW`sNvB0Y8vD>OQvnHv%VjV#Mx$&)S6+UCgtA=Gx0al zexJqY8JnAGY^PjJQ=`}{n{@PZ8NNfa^;}0@=bCun{pN~T)|B`u^eGVhnEEvkKIfS0 z$&XUM@E+exUY6+(M|yQ?myhhOxdz9MyiQJWw{m~sR;+cG=?9leXwYq&f(vXiam~N ziuq%M}KO~2Dyepe;<}Wx^nxQyZ{?NIC z>C?(U{88}Ou_FP@Qr(39*H|ngABNA#M~-WLYDBw4dQ=y_3eErI-`0Mn5^?%|zyt7@ z_KJ+LN9o6tUD<)}Af{8TFRiLt}8M3rZ@#nnZ8co1e<)W9}4P?@sASntun`%dnvkA9gSM(}6qh z_==9wY$dlY<%oznK}?1G-repz9zFE&sO!^~&|{KT!*}30-8dJHm04{!)~vQz6H!0F zDeph@I(Si*MpkUM{8x>7QMwmXY0Aq1l*XKyCIY98XvQjpzF;+MwEV&td-ff6SxoYk zai=p2w(DF(XjXDd?kqDUksB5Zf^jL4gMvZLggj!_UXY3EUNPi`B0jbHzT?NX*i*np zH@)`(4EiXDaf!SI&;RwsZ6(V-(WCd!mVlGBMA*QDW8F*_0(41?EtJs2L)hXXzTl(T z8fHH1dy#&)4L+4ecq$%Q3^K%?f@%11BI+aR%0d^wf|x(+c#&qyngv_#B>(%Y4PUFl zo7rC3-hwWj9)*j#ZHS&a-W_6}Xy}6TaXyTbauvcWu4o{9Po@l=M+kD$R5XDjPB7t< zx)23aE%ZJS-$ zw)u@7mWdLwgdr6Ghq!Nd5#KyndSCMOhbwuChK;20$7&6yy9{=2mwoq)FcLfU;o4Ii zt6f^7(l@pvnG}_wzV)(&m&Gu4FSbshUnbacNxjk$N3C?z<0Q3`*_HR1vZ$51I=7UH zZZa}^FHtl;&2g&^E0koWvwg*E-l4js)IrS%%g{nd5`no$rrP#i={)fki1VqWQ2#+R zsi7a>r&%9SFZbp1Z+~wHgrQdVI=>@G!?=;1j#6B~zIT1&K0;nqtlLJCJJ8A9lZQc& z8=fC1^Mi;E9C;NtKNhr+B2V?Vudak)`Po5qOI=|o5&>47&2kEG*bM`X2+E9BhdJPI zl?8Ut#|7?(9R-G4eLq)jc`X182l48{DW1ctcc|W-y~-9A;B*q$Xf#_!hmD>WAeR;J_tDo|G^p_opkjYt0HZiwf$U-vfYiW#Q~)n))c^rokM1&<_U6!} zz#mEvopoAap$1LV1&O}yM^BvzxEU0u=10FDO#tj1;&>IE@MjSH<(ori#lZ*G=kE(( zl*3s_rj|M6EC$F_0Q;|7P#k<9BliD9$9qj60-}aLa0y{xT7U{FS2qtWHy3w>7lsVX zH!hfe=XK+CGjRZ@|3heMW|`=z-Mny@x=OExGDkp%{&05rC}i&%lsF?gVZefCKNdRD ztS(*zQ1SQAwY??ZNoC&y|K?P?6omXKa`i_zkTDqxj}ji+7&jNs4qtD#g&X$Rder$2 zhBMar0^;tMI#^vm973WPpKghiLEESvTbGzx1P&HErrjFt`84y-FayHdAf!`x0J_g=>ysUtS#n?o<6cDuuml^oB}gy-{hEw8I?e%qukPUqha zj78Plf;T^e=fCPNA7qs_05s@8>Ng;%j3l0-3pH-uBVkra(tCdA=ZR`babD85?7|6? z9U;WivFwEmRULC`-ssGdrE6=UUGc-=Fc%vbG7C!^rXTk^m$|*Y=PU-%O?=Q)<*Cd+ zy;~!KO=o%ZrWn*b*TQXllo~jK$yaXBk@z}~9g43@n3~BesMm=vZ{^R$Dp9gKq^G|+ zi}QpMkq?v4Vw%rk%rf0CiW*K0%Rt^Rv*5!#wb%)BoKzjTVZhMR&&?TK^J~)op6dpU z^!1|?9+hsdmit{@rRSsxw`1mLYv`vg0Z#RdC8sfZt}2E%Z3|j zdRO}6dN@B%@6`@B3n}~fw9ay`Kui!aYl=rYEAr0J_~mKohAq9Puyl`+!_rZVGkXd? z-~H6!yCRaWCfzTh9cHrI>pklQRB8vMEK1Xw2e;3-9B)#iA%;w!$iYZI*X!~ad+zy+xx=$+YIe^duvKus%pL1 z@QQ;wu@w2<45aqpIs?^m@f^Ee3a#cmp~&wcFx&|ZRr#i_tn7V$o;TYl?CZmgP1E)b zDT&V=2)*>S%xYotkQZ261J<*3ywT*@?QfzvKQpqN6w+Q0l{e`lv|~X8W^9c#bH4~! z!2pa(o*GW$kQvqfW=Q7g?I;TiA-0>7G(;h$@)l!dY@6wq z@4fdF+djxnCw)L&n0Pj4QUkJ}C{lchdz2-{4f0Nd1%;wL^B39E;VL?gs$&`qd6tj2 zDrvSf`sivAnQP80&t|JWWw%BMmZ&@$WDhXD_VaYf8m_&Z^ub7+S7PvIcuAsY>0}&7 z-ZLXD8_7>XlLhpyVq(2?FNOOn&L3Nv2q~#fZ*>rWa?XVGwL4aYT2dHFFH|q944YOP zJm^Ovf8puk){|4X61u${Py-vQd^Ela!!9?-y$^~6yS?`AJWa3RW5ZWQq&?ta>-KWG zG>?$4sa6ro@&L)kE{M1iT^!MZ-H0Q|1m+5S;c=vV9o zo&*pvE94P3wr7*bfkLM`O(@lWmh33-J8xoB#Z+c5{mZ7lI_1|>>_%E6t(8pDJ9e(^ zN#i1yditfueD8T5POb&Im0Et7R_QOj2Ycblx8`!exnh38=@W6PLx`jHr!E}vq)5pB9|AfXxq9xMCCA66jp@v{8;! z!NC#KER4~@GFcp3sQVnnNweJxax3!XoDFz}cszsnWOp{`gka8@@@E$!#p#xOwuke= zjJz#ENgqv7y)9Gz?O$@obp>BLA#2(MyfZ9$6HIQ`Ri`_8G2yG`SIf7Vr#bi~+32V^P}itmw{P~erpT1VkGe9APUsIPiXcFY2{7LKekVjBBR|7;ihj`= zw{G84?D16iULBE>fl8>>mOzH?=!$zixW7?(3!XBTUza{A{q&m_hC~?D+*vT22tJDe z+^g^LB+c&4;^<$6y!@CKAx#hJBihFXIE~LcWoKO3;d4R@uheXKy!3_Ht8Vr@QpH+w zygC&=)70>OFdaL471Ij!EYbCyRV)n+k!9X=qi(eIbknP%kmXS#eIm zcBLvd$jx$;$3!$K6cz{WTFsSu*&DLXh_mKGdYE6kCg+mJt&G-Wjy zey83o*IM)RuuOtej=$}ayOh+0SM)zT`xjErS6Z zr%Bd?M}+kE5E3?x=cTjI=v(5k2Gi(Q-HLsB5j;>W$F{Nk606?Z832vv-r? zCZ*b)`{%8@FGkaHoaV$$+EzVJg>YuXUO;4lLI3pVval<@rN>^y)v)dZFeY>rTM&Ig_aeGlAUd5)K@c_DmXd3k&$X}<=>kzjy_Dp z+FyPjEt6K0x~_MuBxA3cX$7sf3VWV=XCVpDpsQ_@#dk#kl8U9pt+i!Hk3SYV9@M|| zF=V~}VQ|^ZnMw6Tg^E{Rs8M~$jTlHOtBaW8y(c$0sc4ygDe4z=fD-vVD%Z_NQvcg> zVA8TNt~u#!P`;hW9k(Ju@tx$pq?XC8CmW+~bW88XrGk1&<~@HaI-H6kX%A4oFHRNw z*b%*ko|7oipWjT^Q=JkL#|8swa@+PsW+6Yupjtr`7G>c)c=rqWfj6l(#mpK}u{ZrB z(5I?0$U>~B-C@uh_mUJ9#)SWI@)1=YB0p%hj(G6R!w%mwf#%u`=#Ov}FRJuClFtJX zkb)O+6~@gAJrpKf9r?{Ui_@~sX%SKtE-L!@+0aNIoy#9jX5J)KZOt3BD~#EE zFf|KZNr^@(kuv?AO7G#?_$#WlVaIn7mq_d_1f#junZ`WnRyFsyY>sbD_BO zP`QWbJS-%aP>A5hdx7+wxcKI7`nb zHw}71S1p$=*|u>W)_1|?>D{4<{o2*g+Q!2OQ_nm_TA<>jWCY|i(t+?9Pybnq-`{RTd~n@Zo-i23@w>pIV)PkZ~w=u-tX zcGqU;`GpUDlupv$-p5Y&T%G~qOI5#Kzu8~d;KOGT!wswg6*2Aa=;Jp5s=!o?c5wM= z?=KAXgoX-m?rq;PhX8+oSv0PJX&(gbW2&Df_~%rJ_0O3K-h=;nc`z~4pM?Ye8;ziM zh*}x|o2;Lv0=xGBb8rc@zb+pHwPn`Q&|QB2hPwNKN9+SdDs^E1h-_nAVfjlwfL2h6 z|LYm2uKnBP|LKuHXm%h^(1V~AmV1JKEhW57Cn=5!9OIY)e+ZzAcf9+!6(AOfR)I$z zp<>Jfs{q{d&y_jK@o$&=69W_dG&zgOQHQ@|`glqj6#@YFV5AGpR?Em@qb=bb)A>_! zb(PxiyE<^RjLb{+)~yfnK95at2UuD`qNei_pNheA`lVO&OCc&Bn9j4+%s4AVhRmff zS-S_G$EeiOxf!U`G65FrQ7Y;+BMAOkDdmnFh{_N+1h~El&)}v8>je_e{_RS)1q49Y zAuy0`Fg}eR#*#hdf&{fKCSPg>QPT(&uYe>1z&)TEyrrP<9u7agSY9B(&?HY?vpBVb z6b6nwU8EidqGma)FJR0M1GO>W2FAfddoC~!a{(&TO0Pb@R-|++rV)H>$`F9WG+FQ& ztlR?98#Do^ma7#w3E28-a{Z*`fVuqJebJ0*Ly2Wxl^>R04`OzyLs|$4~JBRh$$1 zME#j#pOWSM`)(#p0(sRxL*mrLRR2X6KrQ@l-v0aC_u4hZr%Mw#+)2>U8D_PfkyqSN z0HFdL2OM06IG)XMrZ8I1%&|a%oieA@*=Wz5z#Bc?8 zvvJS>P;{{|h+~6sf|jbM``Q7&dI3|Ryn6Zftl!udFysd723BmeDVF0*U2-8sFl^DY z`IT_3u}IVLcAfY~A13&M!k``g3K{xbJGEz$ZJ$RXuRR1xVqU=3 zp}%~vyWqDVrc%dujCbbyq9IVlF#Cj00X9+_H=6l=FvhOMp9A7EY98+;P`P`01YZoK zbfgWD%&+U;Tf59V?>J_^0EycmkUXnbutGD1{vl{VHNpMeb+C`vAHvUzE5q15CHJpZ$E!KWwL`i<+=X4_ z3W!J%EPO~uN}t|KtHny(N}E56xw_ByAIlJW3ZJB@ZQa1vrKe1{RMka197)`%GllYI zZ3POpvXv0yOBb4aHsX;ts}mb)iwu+h!PcV-fYcO^%QlsQ(Ra;KNDo;Eb(+!>a}g_s zymz+i^h+0Gl~5KrKoD8%9rF|r2Vi*)Oa_-4+_030^mp4@jhp8O_V3X%|1vVb z+T^_1ax{XTcHB6bJ=aRVNKtR=7t<~Bn2JkxSmsL6oBWq$g2#UFZ*m|5!}t+uCTiO| z0&?-$7y6B5UJ?d-I=!!PZIq;R4iQ4G5t+!p zF}{1b-ABhc(@Q*<>>y{JMI0}|){{3an}}j;!@lndV~-8JSPH!0{KXl{JKbwl804*tKBme$w}I;v_ziQCykQE41v()2lik8#jHdk$AeNGJ10R&T@cxo=jvSd2jTC zoG>@5B%xEK4ZRom!R58bxLP~`s7w?SsZD5wCRq{39sVYM?UGUqCVGk7Muk=Suhk9}$V{bR|4C~BP_VrvJuMt&b zYkrrLVI><|*8FQ%PNu(mW1}0F^$Mla3{_k}vV6%=)P*O+_`+Jd_s(W*1`gorYtmMx z9jZSUr$>5;(=UXUefN)Vma~NEY!!+Sf!c}RSoETO)o5JK+zd|rv2BT`Qx3MG zzOPOUp0hT@HODQy~5oncVFOeN^UJ$Ubpv&>ms?V{Y0N&J!}MP5N7~0nD5DT;=tkYczF#Vtqdmm9 zn}@C(T{8HD&<(I_;S>a-{rwniEJ?rDBX?Zt#o zX={|(x@yEXa#Hv(|Ek(=tO8fXGEkoG@7g==S~UukRR@<3-uKNtB| zL%~JKK{pv5aCbZ&jn97QLZVPyY{e98I zY{YpVj%=5}Yr4vXwRr+Qv1ev=D#U4&{s^u#xm(Q!&L1_tGY+^&F87yujx6JPU0tW=-i6=_XA%=$ zlL*~)=_}rHQ(mJkD4t}Cq%xip3dDf(YqoJkLC6c=e0p4%H`lL;N@YA{d9)wcMtr<1 z6}%UZB?7T-gcCJJwk{Z0ynqqp0fTN@b5bJ~b_WBwqf1YW4};)M*Qo*ZmCgnN+WSb0 zOX{1ZQbQnea6Ci}P_410U`VZSIN;_6Xm7%S+ytc;86>$n-H%4CPbXOPHO_>aQ1HAr z>{#)XIbO;{=!zPE8jKoNRyrtKcVXAEI{qM)i$9RC?I&dMgajYTN`l2k!^|5PCEsF! z)agPpDBSC$bP`+617Kz1G(znF#y~&arZldsB)?u;YhEFeoeMz}B$~3ja+g|oy)#eW z=M2Q^06GoT_T^>lu zfKYk+w6|YnrDh@olK&061B(y-C+auo`tM1Ae@EnhfHP2I{bx?(&^^H^po;w8z&aIU z11k8R(gl~E{@YCd&1AT<6T!&Y7p!>R67s zWL`tbJ`1$iz19EeqeRb=30l3mnhKD9nhXKzOXJHP|9Z_cjG$P&eCE!Iv$%IG4Mo$y zzI*5kU!`e5#b^w+`CZW#C$vyzx&yo$Zs(uO5d}O%$$XLf+;|miDsGBopgyb?*YS?m zHA42HRKT);8Ftn=c|PmLdBAMUiaJq2IP?NIQa*i7(oH&gZ_{gScE>i#uS0p)4F|AHl)NZa#>-Nv*Ll}G`r$ldt&zYF;#C!FU z)@lrQ9ouv6#U9b+;yq2kR$XDnzld;(VS11ni>u8MAxL|b<+ z9Ch_#o$iH0k5F@_EL!l;llUW+Fc-T!j`vU<9Q0A$-qs)IZGN!tuTYv;U3uzrdvg$3B6O#IgwL_O*(1q+j;L z(xx5vwuA*GuD()Su`?{(E~&zpY&h4Ezjs*$=qjKf18BEY_@4OaRlP8E;AlR zIs#j|Fg4R3DRl|7ei~@HWyJ%LmA0}n(LZ#d@QbQ_>;(gclstDB&uoCpX^9M|`)y!l zl9EGip+z|E*B^D2oZQv>#LE$Q)r9CCP7}>s{V0S0#;hoR+s({@2|wFpDM{li(T=XKr4@!fnACdP&n7oA zP*c|%ger-KD9#8Ioox_!G9mgvkO!u04JPM8gEIj;BO{n#-QPqhbk5vz-R+nV{1HtVpW zF`VdKS=9M>7d7Z!draAsGL*YS&XwA%h zA2HP2(yqMXvz28F!Ll79xew=0>8A`?49h(pWFEhE1aPBEI&63`&Bt>^41CUJGTLBg zPFgbtSdc+a*Zf6HRfB@PU1}d-(3gx^@yJ}q#`L=Eus37gB9w}f1p}#KXHTZa>&AP! zkW>q~8dJl5PMWPAzU~Ki$=BgqDXEIzTqwddWNv-<>fHJ}@b0KH)2LWojiN_6r34D) zmsVn;CL*B{fO1-+MoLB;hwjETN{?*b8KAuB-eCs1NxoU>EPe63q4T=wD-cUNJ_tIo zUO#j32g(gFtJ|wt+0RxlXF0qE?BrE`jLFPM$Aq>4t)eGWO5Twrr{9Vb=4?^*U;C?^ zf`f=|oZ&+J7_I(Z!l9ykv*5yfkWMh!1C5j2<2iLz7%{QFVqWdGC2&p0+m{{OIhQp9 zZZ7@dnqI+x;5iID%Xf~r*MY85_6(N3tTr~o#ziIk17z>=JVLb8@ppse6RlHgxhc3hR@2%dv=baXDQNv7$GhK$QNCHcDMt z*=940LL^e-+IVvbsu8=;`~$rjB8Lw_eSHSisx>ot`T)7`9wX-}7bY z*T0J)P#G>RS~IN=tCiOEPooD6&q1ZaHY$>v7VZF18uk+?)RXnMgST1LjYlT>E;kbr z#htwaxvzkoYl@0|DvN-=34(k9Bkkl5%>hMD56KbfjlCuw{1kr+@7(qVKg^SK&=eua@%{coC={|+ zl3^Jmh2i;909%d*I%a%MBREs$yDD#pfjc=hKKpE#_PHkC_y7{mQQ5rT?k3N$jul`5 zmc5Tg8hxU{*Jw4+%VV}4zF?~PL>$&fzF)pDCptGqJPT-9Pj1)Vh=bW+s91h2;uP5vn>!;Thjg@_08Bgg{4ajY4N5B8j%E@pM&6l=X-AC^`WcX>jno#Usr!_r7M zl3ZPB`?7w%s^#6#d3?X0Dfv4`Hqn72iuGj~0}Ebm(0jGXQZEW~e}IxYQvAGM5aU-r zYohVd(Fm~XG0uICM5Xwgs3z;BaLv?^cmhyM1GsJJ8uUbcUG_qt z_lpeeWS0<<2X`6$l8riH5(F+PH!0k_#>LeZB-4(qwp`26g}2L2J!|LMXUDhlmCswO zq$AOsuQet2%En~}X}~+{XZ`F5e!+UPP8FAiMeWA-ndz`>Uv%(9eW!6@|IE2|e8gsh zLHwAFo9BJ9CJ?q{uv`R~X@91B$G zD?hHO{0gu4L^4LVh5f{A8kk^K`4g@9M(Ohc_~OUeUKamf>eGGU_=| zu<+13iz!>ZTg<1@U?lf##ccIuM3}Q7II_9w$FJ(0vo+>AJf$F?2ve?pj!Zu(GmmU# zv=mH=YhD;-P)dG$1Y9)x7OQNochCh1rR5lo&E@Mltrt45=xATtpweP*e{GtfB-e4* zi}hhgFqvt7Rk9f>;I!#Igf;!F`DI~-FH%M^J3D0g{f#6o9JYMYqoD;TUiJ&MSbDr#4gC{m!)yp-$6N?7bHm2Mw$=8kbrag>P?W)p6a!P7h zHW;(g)rM1Zs}?&d;&zji%?(qEG+q?JdbnppZ>`^X$5_$*rSLnY72MyOJ1_esk$c!w znI|4SdcTb#*8fwif2(L4C}~rT4T#3bJo1`uHV?nCeQe6C+beNxwtw^(PpHnX=ZBn; z>ZrWIxl^CQD`)nnNg4z+CP!ZCUER_Ro|x3@4TkkDP1r+npr^h5YIjymspXQhVkFjd zDg4k&z2!TY3;EOR3p7Z(kA%evH4@+!q2#$Zt0)&}Zx`t@IkxH9|BtTgXh06|vi(*9 zYD%N;CJjJ4wFO{bK>wE=*f*2-|FmfXJsi|3-a*s1-9E0RB0(U>&`nFN&I1Qps6PYq zw(WPB1Bmy3)>sZCYYw{4-)mB50u~eKgxC2~%5N%XvZ4V}EYyyD>}kBqMN2*v2~_1I z@0ornK9#+L?r4f5c&tnHq}8NV1zUyLO4J*maDP4sDBJ@@V^}%B0w|Sk=+b@#nOcwk z>yW|0{=EpC1N&R{R(Uw0~#? zpz_Z_K!9@KWCXBMKo9?ZUH+ge`{0Zb@cH228n8wO=PLGZ+&_dzy^(qliK^WPg8)_z z2JKH(c@{VXKz$6LK;9Rr!T{|bCfXmre{hC6e*ZAy{&)az|2=5`dDKDwfl#WbK?er{ z|Dpx-9|+zj;D1N3Dx7+T;9w>HuZa8Cp#Mr7zyXy2kZCjsNR$E}4wU|np#BqaK=$lE zNfSRX@Vl{3Skq9mXXwnHd;;*M1vXy)<QZ!eg=!y zk_!RPs3#5q&ZNztH?sPFCuT2PU6WG@3rOm%a?#tt*&yyPr^}89@$^p4Z7@oQ<~emz z@X(rAXO>CFtU&RI9(rot4g@TcbPa%)!Y|oQN~O*>rmV>+5F4w;cUS9t(@?ODL(U?m zYTJRS4~A2B=n0hO@lp*tTq*U`7*$N*rl)RFq!68l@nPqT*J*LmHejC3Rm%B4i|y)t zSo-x(n=SJ3$MaYAQqPfLS4nF~#PIW;r52-o5S7g28I5!n3T zUUzutOwHgLrE;-iiDcX_{n!gN(BwU2DEv(KG%kw-1Ku!kI05T#-rD^oUX+(oHyR!m z=~t6jPT}L8)810htSYjVoz|PrA|;DfjJPSv+3mjY7ZK0F?RWu&Z1uUSIHa5~+9H@J zpYbGpK8skPjPCa-jUKljJSL3J$L(sxZ_LdQFIu$oOxmZEHsZA2DiY>c z?W*f3eZyLB5#kOr#Kz>+@h3wz-(MIqNU`QkRK>+pVpi7Oww@_h1C```?G9zdN2v{c zkgnBwZrqCP*Hm}T#4h$Z`dkh4xxyN0Z=suMEw^sRQgK1GXRz8tO&ga(3e;A*k<|Lr zV5n(AQ_MDe$F?RK=QFcvXg69|R)~B#Uzj;{(a$etV^tt92(64V?~HUP9l)7?Mz7CT zE(+)lt05RT9@ZM2|MKFopZJm$GOohduQ;n;Gp=doE_Od$rS3Av~JRW~`_IZ9xKyC(N^=x2}97+DnPMw1c zaISKt^<_HH9nRKnu7gk%p{ZmU$kj9|I<Rj|B>P8mr7tJQF+YdxdppW;|P6VA#-M zNFl$`8__S)PCY>l?ASN2KncpR;{B?V^=rlorfc>)j-s(u>JMgp6CS&KV2Yli{pH8C zvH3wOi#_PG{gsKGuY2PS2o2l$f)*P-Lf#mIw97u@n6;oN;u}~87iflrIN0Gq7DsbLGrG7iHeYxjc z)U0#N$njDC^(x?uG+=(<2oa1I>mkuzx}`?f;)+U+MOnjFtHVHmvl9_;_ay!$ea!-lu}DIc9oIGHJ}Y)-o9T@Y74Yh zGmr=l;=Np}w|^^I*CwR-h%3QP&s!e$?Q$`9ez70l0igy)_%vP)KuqQKlZ1L0GPs_h zCyjU(<|Fah@5fm_j|>ubWv|Ca2LKl6sa^Y+IjYqx)2rKL+q3+j?zf+gf67nqq{BP+ zhkVGUZUPuD`CNVC$^tVpelKY_+fYUy8T`84Omt<^O&Um1Yt}2EY2|_ZH`T+Yo&l$8 zK{hU|S+HI;hFZKfyud#nBp9XzsZB*)dRd(8>5y|rDbG-*m*Eo7%Y_E;1n{;BGbs_^ z6(|92TN^enx|~8@lrs10j>3I;l0&t0UXnE%E=dCRIYyif!1LDCd1I>qqJGOocMNdc z_u<4GG_u#R)Sm_~3>KuuFkrkRovZ4KeqGeYt&YuJkuIOtSY&^TTP(=1R6YTj7FL(w z)-pGDnm$)h;$qaoec5T9q%vN8c)o4A#Yu#YEz3jhVNKZ$MoUVjHERZL)z=wAUNNNH zK( z95G9(#eE~EcUNzM3}d#+2Vgw`Z~)V>4!Ri-KLkcQGu3K0r)WHubo3F*vb|)2o|`n# z%b+Bux!COvCovg3m+3u=ksBl<1h*ratBgb}i10RIT4b#1G1rQ2RusbvA-n@gBa zC`45=pFkawE{TpebB;#cm6V9Snif2%#S-tMc3k6!nbvNS9aCM+;Po*fKH-49@f`~wXVhg6>nW6yG9V4ddp)wfR8C6&*XZp2n4gr3aG7gijz zwS)eQjyHuPvvGTYuR}A)XXe9aq$^7IL{~F~DaoA(;4KICS_;_5a}2Lvb2hqg^|*_* zLQNMRF3ZVl&-j_9!j4H2?!-+p+70U{ljH*DI_qu`PEp;mb<3Y3ItYI|m&RAkfEtFu ze^p9mf-K%Wp}zis`o-nQ2dsXcZ*f~A--AUC0j16tK(qmOn^FT_#w4B(0!h2&8ES~O z9HpMcy?nz^_Gt0z(+6Q4wz9VxSFC6y{wco##bTiA_NIt9 zZZ8V9c2^Iu8ds)k$x{j2XjAhsQoBXaAZv~|dFq>z1Ch9+xO10UUJhpZU;1v*5vB`W#wHx!AnU) z>s`XMqyJZPUmgy17X~_Gmpxgs=4(;Ol09otDp^{DD5D5v8M2#UrcX#hJ|WqXN@XWI zV<+o~Y*}XP$uc9$48zPlL-l?4-sj#w?q9d(@jU#_Iqx~|d*1z=^G2zppAv)Vg`rEu zDL|7>da)BrX0=Q#wpt0>W4#(s>Hvz!8a)*a{CTOfo{c3ZfncdOF^s&uY`5@Yp(#NR zjccc)ItiDd-?(FV8asPNs@B(@9r%Nw>*eYxeDXaEFk|x&zpap-lz|%LseJBjy{Bik4FR|=5Vr{D7$`yR?yu!J5eq033}Nhc zVtI9fk?92}4gxf?NGIg^-JMh$Cj;l{jQ!|BP7t7hAJ77Rr?&ui?(z}n-TibVfblcy z1|xPHTqfaNSoEs_;P%JPJoHWnYL7ep0cC_fgN8aOGhU8|GIW3|yg(O5IzZYK>F5Hj z^s5C#ggeuNUOUs{W2Oz|ORn9F5&ykhun=B+Z<}Gfu1q20e^(8L{s$m9aQ?!1w4EM% zu+V>=Up#$-e((2?O~f5!3Rk6DHr*8$NAc5?_&%pe%k`JbzC!!sJ+_ z!=E`?Owm~cog*=Ux27Bg;D~}}IYNh5JU88(YpJkz(>6kBriTi)`tz}6Tfozmz1x2F z%;>TH%Cy$NYXKjXRazI!3@v&qu$qr+_E;q{{U);?6SKPE6lImBRz1juL)hy&%wvxA z2R;J_3f$`z<{fwEaVMrocMBHDm1BEw2rJ*BNsWQOYBxY7E*qm^RFXJsWM*++bkW_( z^-Sj}()E&2GOhU2Qmo793z(9L{C}5!2`%%m>Izcw+)w`!BONcllawuk2FySYsWQZA zth4`C)(rykJ81#q#)tpd;;Sg`yp}rIK18~tGFRNxj>pa;G7CDudh*i%i)FaL0$ggg}UEuVU}q$41hEr^3PjB!@GF`)>%GBzM1+agY~ zUi&l#=fxL?f_H{@bbTLJ-A`J$uc1sjp#L9|HZuFAH!zoWP>xnta{Wa=oH0XU;#~aelMeMT|WGYl$`Y{?mv8GhMomgMPf3? z@$OScUubg8yF8j1ic7i!-VP^NMfpozgpaQ4NPB3*vWvVQ+aZ?r^*XWq-dnN@8?n!w z=szeUJ3QKf8U7*c9L9@(a_L?g!FfuBd(k2I#;fkstVr#&G^h6QVv z3T$w8_l8}-<})NKCG~89E390(Hj}Fg{I)=}+6sS*GXoM$nWONGQxIOhqU%Dfj=mTT z{9s-ff#0c<>sal|z2OAwk`$h%+#^+Oj?tLz!lko@)+05(P-g%|k*=(u49HL>zjVuY zKhC9O-%u5rT8s~zd5wTyfaV7H;YwXl#RllvBCG@t@5=phYm<|7wvssI(5s@|{3vbj zFMY#+OlA=CPl^99RpRP1MHy0+{HknnCz=rEf+zwWZKO+LCD&dX<7dU!7HA$$sLq~^ z?lim%cUr2?6Fyr2kA32En)=Df1b25#nC1DVQUN3CS*U!tnsw>56VyiJkP&4>tN`bn zD~0>0Rq>h)oC9!zrJuinwurz@Tx~Bbfc`vgt=hI^@Qs@Bdb!Xl8qDe;2Z!5=fjFW~oz=z5daHgYj$FCOW%62{#kkbru2w(vvDgGDy3 z$Abp~bYAg!Ro@;Z-z3Dwd)sZwX%>TLE+^8|Ins5HXI7NpjMwzD2PWR9h^nmBElPT6 zMfa@h?!_A{l_XmLHBMK`l8HlRU*tl9^$ULzzJ-R!-i-`b73_V$p)Up#V-P_2gGaOa z*}{1xVpuO9ty`gzEq3A9xiLc7cHv)`#Qwk+{gD&%{)K4+PN^4bpb&|?NJ_{ zwZ+=pAGVWaX$M0G-N33aMY*H&2UI{=N6zRJKt&O=X(3cLD1@nO%I3SO-ZAMeA}rE; zb6*rKk)GP4yG8()za=g#T(3zMiH0@Q-JXT8xp$fQ>Zg?!-kZ>oN|e#aFKTQeHK=^FqyET?4CNmiRO>qLPbC9oS*KoYvt!t{0a@wx^D<~H_szdUQ);QY?uD!#fM)s`l{McrzX@`jhzY;Zepe@1hQ`={1- z{i60>GMqtN*bTuUt&b4Yo;9oz+`fI}o_g;6(E0NqNaaYUA=k3p-CyS?aQ&0$S$sGr zj1S)~-XmE)aG;0fw;3)2Ee>fa~h#xhU3L zYuf#%`ef2eq7KwvIh{2&qn=!O@2`)8E84wSCKmoaY+IIZ!tQINCUN%36G9hZkEuIgP+$D zDLR$V?zJIMfb4+Dm;mA)9OSq(9Du@2snkld)(+dwmZEiezpv?Uc@;#DrRZtLgE!B# zuv;vJ)fH(YScHX_o7W#d)6MgL;k%*J+MkxgH<%;Ew5iTac3_2a>z+nuG@5%VBRPU$ z?ECJXGC94b${Ex+tGJTZ3YPRj)(*~WSmkBolvNer@MP$hteL;DG=b> zUk`i)1xsYWvHb?u!#?Oec}Kh4fTxrBMAkXWJieV|Ke(i&Opspx)|hB8sZe~2&el@u z3F5<(QUjgRX5UwouHu-i06X-=O&D2iG=R zx(%Ah6%MpmqVw!GNcYi}=2QAfdBrD4e?47teg=eqPLj+=i&1=O)lYqqnWjWbwcY|3 zi94fBCuAcGKYxHLTf{m-57c^(bVMyX|C8~7Wdj*2ODVZseiJ?aMuU2bt6-a#8*}`_ z-u%I9r!?#71yBi_fs!v_zGl9?=^9beTx$E51ZKMo+u=SKa2eUg(I4^F0jH*zjvD$0 zwPOT$@z(|~&+YZ7e=^Pgd@VQj#v>^aUf?jhuebfYKd2jB>-NuE>5Grr*pnt4jS2ZV zOl0elobwkSOWdV|{{+|8pP@j(rMCtb(J+T$M1nna68%Evta9_p^O?Bk=Lv+2ht3zqB(;Pl`?t>dfopHkO@jKN(*pBJ<5K(Sz8 z$fA!IIIiDtLLJ6Z1nW*PlkFlcXY2jaZ*PBaCyvhY7+gk|HW1aiWIUc$H^D{X!#4!Z zFB&YFoN7KL_C)SzPn*`m=! zFFW4M4dwIP_6jq(M-SBKLD~*~J6;8~G3Gn^%&78vma}xSEM@G~On&kq!qxU18*>7V zY18JF(Doau@}N#zQAk;HxZ2Viztlh*5~jfrjl0`IQygXTOBU}fU6`pe(HI+aPB9Jm z*;D@Bh@nk!H#}n_IsyOJWkZcC4t3Zs4sCETHvQ#az4kb7gp|LRogItQ+9x7)Q?eauKD zZ_qEfg3{KLugQOX#f}MwEIEAqx+2wLVZ~H7r(GBKJ@6i1^@nc4MfzI=VZzNSx|YUVs%qgX8~d~~D&qoSYU$S& z=CVWObVb~aHawd>RT#EP?vA#)=q8CXsiTUoSreS)+6FY(e1#{!xY@uroxB9!P^Q(rD7j%U4gVsL2O8_tkaW?yTz2z&gx@nRiL7E4D zDP8;D)ev5jmBTIfdy1D9shs}#09p+$1^L700TAwrCA0SG`2)4Xx5+j{S%&N{oFH7? zG2=wC&A!s8vJ_z2=w)pOz{5KeL;VEHUD4V}3jjwJf26fN>@-d+KPQXP-n*OkyIML; zBLh4;te*M4E!As`R(S~p=1y%#|8&PWDkdUkS5D3PUYHr9j8JN3E~e&T1Nmz6y1$3n zj#|Fosxw1~ltmMd_00Ja#s*JAa97`NJ+zK185Y78)~Cbl4xz=B8Q1Uf)-nh)Kk&Vr8(`7CdiYR-w6XmA2NY*TXRDsm5XYJ%zw?nTsiSVC5T9<&!Gtpq4qGs? z%p4+rTx?5joOMs$*0*%t8j^#=HF(@Jqnd;2C<<@%+>IHE%uRDyMFRHGnr%o+^@*ZU z;;{iGru<-sS_~(HCCJAJ)*^n~gnQ2DG$i6H_s9pnzfSHN%T!EQ%;x*YbRTz+dtcYo zdZm(wc#uwMI3zW#l0Y24p>||=8|hFf^>@OQo6P@&NbW~@p=8zvSE>q3F1VR8c%wpw zbuAB{t^9G;fo+Der>|!7d(58Y|Bi7NoilV82N^_#p{~~~dAdc!o=oj9+AW{Mv_+F3 zo6gr$Iz8Q-I3c9*1B$En#PW*{tLP6!QSR{?Rg&t+Z>#-r%E=%sMkn)WKrldN7S>L5;QobJfcZi6HX|4JODIJVbaVN_W?Oqk$ri=} zJ%MIcU=Viym&)j1hkSX)9a^!7DF+Ac-`O$+GV3=T_FcfdwfI;2|Mc0Jg5C#!s@s7{ zc>}1-W=lIA{EO@yR?7dG0%|19oPW~cK3DgC*5T$C$2JLBpubTKWQ-tx#_rwJ!kU`! zClwk-q?d(;*<%asSmnTrQ)5&e+Bz|QsuWSqZ!b}>$a}#k7;`?vVUt-QrQwnz6vDky zP`EQMlLE++3f3M#^VNc^AAQdazyawlaiE-#0|4PqW!GAYq_;Y}#_SmfS8hK&*(`hw zRbNm5hI#owlDJb`AP61$SG$*zfLNc(;W;{-AQzi0IL-!Jw}VEB69g>z6|=0!X@G;%nFtnMfD`}^r8fgO z^o{=i2@K*mr~&Zm93ulbp8sEv14s$h(y`^O73890OYcX=7W9LF{&XVHn|~AGe*?3} zmQDn)ktfj5|2tKF6OB$RI?({Jc8CT>p#}H-S_H$OB=i4)s=vqoZvHj?p{kFgoR4Ut zjj8Ak@n4OexThFIYEo+NW!c#zr}NRue6=J*#V!#R@7wW1tGarbcN;B=IOMB8mB&C* z=jRx9(EL<1%GF5FPd&0jgwvIk?;k?OX724adi^au&qVyoly7$~ewRGH8dJZ3UC=3a zf+8Vfb91{q%JHC36p^eLsE68y*cyt3FLEz<)?`iJG>p* z0JbJ@FP$=x!LGGB>~!hnuoZJ*T)()(G~6Xn%AuVNWgVt>1ki$mUGq&D=$l(tr#dJN zr85)WR&*hD2Q~M6E-;kNSi3`CF*7Ud{Kj-smf_^oGBw41`A=tNcMWG&)exTS&9Ht(zlCvw4BxrKzAncN=2Ip1AJaxPy(H1x z$cg_h^f^GGFm+MVd76T>$g7?)y{IkqgvJB*!?6Qppx+&S=HZ&ynB)IS!mGy`J zPFpj%lfQnCXC(JT-^%&31`QoFwq_y2`cJ>wM^6~n7aI6#Cx>R36L0}3J9N7>TJNWm z(xHfA`tj|hmW8#p0ASj8rAMErveR{)NB*cyg`%^>>iJi>+O3|&E!S?RF`b4)E1^+Z zU!YZmzQb}m1hNLQ0>p#O7W@T_oIC$aqmu51Jb=YS^kX0+_{D3pD0!PNcjlBu7nm}f zZeb;Udsq;*v%bZC20w@Kw?!!{O1ep+rf{v>x-cQ^oIuH`gPxUkKSpTT9o~*+L*^C_ zV8au05sqgf7dt<@!VP}<<%Q4I?-}5U&eJSMIzJfQP$|KE-j83f8%x!i3Gq%1TRn;G z(2}2<{Fdwj52Xu7l)5cJ*bzc&I?GDLcW<`ra4(o&9dYAvp629G8X~oa)X>$+jE`-- z3(NMT`5qoXROsPD+>syaw?j6Ndne=c6st`hudqHS9gg#VdRv?F(FJ81*PTm}z}JaH zpBizvlA?o`BiK)CN5&#{zCgYxK*l!ubR$Ec=}P}`^ZHJI#^0< zOR*+9jxljq9;mL<6c%DzpCs96ZzcA5`}B}X32i~sVx;gE*iH9*?F}gMKzL(fV!Pw? zUn{o~+Xd}|B(9eemg>_Tov#TAaBKG_q4ux6uCFV~=ILj{E07Kkq@`&^C6>386x2^z z#g!wigQ3aQoz(&oEB|!ZaeHWGHm6ndVm69~hZPeD^aUUQ@7j#T#Pm>|-mI>qVq{Uz ztFz6HYj@+fwN|2hahpjyoWI!0foIJc338j!7|v?EQ(QCB>(_;{Y|wAT(kd=*2j&Tx zvlCn(x^ZU%Y~V8*eN@=MXzR;TRpDCHEp@Wu^o{E!{yve9jZrr9PdDsB=12lY48myD zJ^0H0yt$em^HO>dSN!3O1)Cp^5C}uQ7|Ow6X1WJE9Hxs_8yGYwPB_Wq;HInVJG4+= zN5VN^>-#k|lj1N~a_@Bpa_;d`YxDO(=9Q_2(5n2p*<%-Acec;Q=^~29l&UpXP@F)~ z+wNg<*TRNfb0wsNKnK5fgcy`jiq!I`* z5cRsc^+r~A3l3;M+aU?e`IpcA*k5Ah`?`U%7$G|>9vLA z$(ZT(rdTXy`xPg|Z~!D~W5P#ie0LP1MhG|`>c+rWVDtXztw#_O)b_)rB~va?lD#Go z67~AM`jy*bE2*+Dx--UI5{-m7!rZFf=)JLdUP)cAPbX-O_0}%9Nuh&@J+os|>v0&L zqsjZ1+zz1CcC?JEc%|s%Mrq8^fbq~va^*Q!7y3Ey3HpB1ZCFmOJQ}5y6W^gBA-D_N z1;RR)*q_o$=rvX5CX9EYK3{)cjt!B`&P;@K?TMaTm@3e|s=hk^)S-_Zk2xZ-(yuqo zgWp>VRM!z{pGw2GJ-E=zBLPhUwCXQ|uFB}%p`PBA^T7?G7;9-XPBpc-u@v^qfY6pB zLpU|Lq}0|rAhT_wRg<-&h$X=sEO6DwGSxU0L~~hQmmLqG^wzV8?*@#1xA#`{+2gVh zw^JZCJ&kslQg>oyBnQKw4twpmgeziVR4^y%T3m|3*&U$k5`>I z6?p1F4xyQYfHl@Vw;5r~LR`{YQ|gZEr{-!v#Y&dV(y12vIy<#y5KQ@jd(o`|Ew=D- z%dIc=z-kk!f3{IrB19#yEbciiA`|LCRncLli8kJgA8~p6Dz7v6!9u*@@^OZ!+#SqK zO(3i!0dCBjGMf%v0q?D-S7p7W52c_ zjB2-Ic6d+_(o8DueY3aY%$<`+;r`~Sx+VRkEM-XYLVrp~#fkz6> zZSp=;>mca`$zEcmq{DOHOtT1TeFyUfkJ{e8wI>#V=dP@#6OUnKS=|fBMlz+8@8z>@ z7ss*?w$l`gppw49oV~S(d2ONT2OCcpF1-b&&OI~rS6R=xulZn5F~mf2MO&q$T#bFqvXdc%|$t^lj-gO+e83 z0x~+M_MXEwl_HKuwW=ux=*BVlxNqZeIhgxvsUA#39_zrUCruObs-pEk`A^!40z;wD z)OdTd!U4|Dy2xmeW3%07fqd-=Cs_25i0dR0O)o3@gZbxBo`#B_FJ)?w>WpQ1d4#p) zwHl%Rf~}cpwQBM|3%Ku;cfiX2^099~9QDZQhy383R4wXu(WJjoB-0}CJCP@MFraDa z2m_h5Zz<36MD8AfepK5RC84c;X339Ul!si5(f7_oG}o!xrZK&W3`roFtg1>MM8mkp zy&GsFfwxGxEDYr3j!6nJ!tsOJI;}_EX+l?Y_Y(Pb)g?D_<^cgtNq@MXp?XlVlb9pRpc;x4vD3iaBf;x7Wmn=7E;o zI0d+BJ7x|bV{64sluZ$=y`@=!N#?;{AIRNI{?l(KVqsPQO93pABKzbutA;EZwY?6b z{r#tp!fmM7`SFnt!nKzOH#b=~AT~k0Kdqbh*P7n{mtc|7=9%{)vy;AmGmt%i(EdWM z7a}JZacTH4x}~zy&luMGI|!>)=E3`k5_pD(6cmVqQMtLUzG-}{cKfP%VL>je%tX5L z`3pn_5SH&9WL27($o?VS{sB@BZ)Ncj%+g9jLqkg`0+L|(HX6iyzjjWa(a*`r$pN_` zJ~uRq9I+V~t2Hj4^F3( zSc!w*igEW;?Hj5{Z8Eg7xZ%T&kM!BF$&VpH6hc*C!#87RnpXDV)G+5;rSNRRum>mY zE{7u;+xMF;r;|h_B!cYxOyNa*h`t|v2rDkU5u2owD!S6g%QeE_^=!Q>g+f8SjY9`v z2N9T)>KbHwe(09qA9{H`KKf*-(x>kuRz)N)iG_uFrwS@I!yh3O?VztNnWmqiuX~|u zDQM6wYRdTgKuY_Gj*VQGrcCyx0+m@_#gW4-&x^zOerp~DRWyO(6YkW@Lp8w zz4cd)ZIZ|}*rqT30Y%Z(mM1X9aU}A(%iM;ZSUv6X;)8z|^S+>r%3?s3$EK~GkqAU9#U7iFhR9EF+*|XnZI5&4nL#P(!ddN>6Gd^J*t5k*h7v9UY2Mh0FME~+x8Y$1yULUlB zk>b^==Y&iUllO}1lLLNys1b%yH@!?W=H94HNmrk^sb*AmYtUfOe9&QVz31&En5dpA ze-o|pDlxTaC7E>C(GT@+WNgLP^;04xb;vkaEpk-ZYcfsJvz}dg>nd^xb<=Oeqeg7z zxt(dEIBdPyia$5jMt4Nj<)DiU*Oc-TN(ylSNP>P2H5#?CEbKdVnRJc8i$0Vf=R7QOG}dtc5PKRH?ITro!%Gh zYS-~q1oFZq&k#0qQx@5)R3&BEi|0BcTCa-fV)tOfMxbdu(AX&oN=@kK7-x>4oro?Ex8@xCNp8 z%|@+5^Lf&ccZOS`5H6{gm`|se?u%fgZ1g|Bt3&)8i4|(Rf-u}Fx;8m1i(IMlrybKA zcN{NtPjMgRZ5}VVEqdEp>P;^%cT7quU+Qr_daixZHH__dDtn$CebMW4dulIfGnBO9 zfZghUg5xce?$n;^lycMmE~h^JsCNQKv)ZDRR{2x6&fT7X)u?QpxG9K5ai2^Mb$>kT zZmyopmn%>=7v}JmFWLXpCkV(GL(m6BYT=!%#MYKHWIz@)S(ihs%hGg)@{n$6Kmk}> zmWV&Q*X9_G_q~*v%sF@J;ch9P-it66P+TE53By!jv-M8$iNI^EM*qiN@(%?;78R1C z{xOEFE0w(~%$;p;fz|e{WKdk%7VGW1IErYOT$t;C#tP!igawFNLH4hxO1N$#LElkd zeOu(sLfD<@8ir%rZ5h0!L#-%*tD7nphQ4>AHa*v~;UNjyk}8R&QNVqo^0T5?s+MTQoU~?UU6OXMroijnmD#>z_1L^R=OPSl#5cT&Nlsh+ zx!U1Y<|^kCoqD`33#11D$YOO9#`2g`_m3Oo0+t5kyl1+D76cpx07}pk%Agm}Kj055 z_cqx8Bl*AeQIzI;wZ$-QAemdD3r0R== zkk0d@ETNo!_v%9T}X*@0=YxJ?Q}E!1wp*^K_94Y{9huum3(p a(0JzV9{BsI0cXLI#z|Nb9eB+RM+ literal 0 HcmV?d00001 diff --git a/docs/api_InnerProducts.rst b/docs/api_InnerProducts.rst index c3fbf4d6..bc9426c6 100644 --- a/docs/api_InnerProducts.rst +++ b/docs/api_InnerProducts.rst @@ -75,7 +75,7 @@ We multiply by square-root of volume on each side of the tensor conductivity to .. math:: \mathbf{J}_c = \mathbf{Q}_{(i)}\mathbf{J}_\text{TENSOR} \\ - \mathbf{J}_c = \mathbf{N}_{(i)}^{-1}\mathbf{Q}_{(i)}\mathbf{J}_\text{LRM} + \mathbf{J}_c = \mathbf{N}_{(i)}^{-1}\mathbf{Q}_{(i)}\mathbf{J}_\text{Curv} Here the \\\(i\\\) index refers to where we choose to approximate this integral, as discussed in the note above. We will approximate this integral by taking the fluxes clustered around every node of the cell, there are 8 combinations in 3D, and 4 in 2D. We will use a projection matrix \\\( \\mathbf{Q}_{(i)} \\\) to pick the appropriate fluxes. So, now that we have 8 approximations of this integral, we will just take the average. For the TensorMesh, this looks like: @@ -114,7 +114,7 @@ Here each \\( \\mathbf{P} \\in \\mathbb{R}^{(d*nC, nF)} \\\) is a combination of .. math:: - \mathbf{P}_{(i)} = \sqrt{ \frac{1}{2^d} \mathbf{I}^d \otimes \text{diag}(\mathbf{v})} \overbrace{\mathbf{N}_{(i)}^{-1}}^{\text{LRM only}} \mathbf{Q}_{(i)} + \mathbf{P}_{(i)} = \sqrt{ \frac{1}{2^d} \mathbf{I}^d \otimes \text{diag}(\mathbf{v})} \overbrace{\mathbf{N}_{(i)}^{-1}}^{\text{Curv only}} \mathbf{Q}_{(i)} .. note:: diff --git a/docs/api_Utils.rst b/docs/api_Utils.rst index 7903cdc4..f893097e 100644 --- a/docs/api_Utils.rst +++ b/docs/api_Utils.rst @@ -23,7 +23,7 @@ Solver Utilities :members: :undoc-members: -LRM Utilities +Curv Utilities ============= .. automodule:: SimPEG.Utils.lrmutils From e9fea3bad2c49e7da15e1474f6864f20e55ab7c8 Mon Sep 17 00:00:00 2001 From: Lindsey Heagy Date: Thu, 14 May 2015 23:43:32 -0700 Subject: [PATCH 3/3] lrm --> curv --- SimPEG/Utils/__init__.py | 2 +- SimPEG/Utils/{lrmutils.py => curvutils.py} | 0 docs/api_Utils.rst | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) rename SimPEG/Utils/{lrmutils.py => curvutils.py} (100%) diff --git a/SimPEG/Utils/__init__.py b/SimPEG/Utils/__init__.py index 6b04e042..6637a138 100644 --- a/SimPEG/Utils/__init__.py +++ b/SimPEG/Utils/__init__.py @@ -1,7 +1,7 @@ from matutils import * from codeutils import * from meshutils import exampleLrmGrid, meshTensor, closestPoints, readUBCTensorMesh, writeUBCTensorMesh, writeUBCTensorModel, readVTRFile, writeVTRFile -from lrmutils import volTetra, faceInfo, indexCube +from curvutils import volTetra, faceInfo, indexCube from interputils import interpmat from ipythonutils import easyAnimate as animate from CounterUtils import * diff --git a/SimPEG/Utils/lrmutils.py b/SimPEG/Utils/curvutils.py similarity index 100% rename from SimPEG/Utils/lrmutils.py rename to SimPEG/Utils/curvutils.py diff --git a/docs/api_Utils.rst b/docs/api_Utils.rst index f893097e..042aef67 100644 --- a/docs/api_Utils.rst +++ b/docs/api_Utils.rst @@ -26,7 +26,7 @@ Solver Utilities Curv Utilities ============= -.. automodule:: SimPEG.Utils.lrmutils +.. automodule:: SimPEG.Utils.curvutils :members: :undoc-members: