import numpy as np def getIndecesBlock(p0,p1,ccMesh): """ Creates a vector containing the block indexes in the cell centerd mesh. Returns a tuple The block is defined by the points p0, describe the position of the left upper front corner, and p1, describe the position of the right bottom back corner. ccMesh represents the cell-centered mesh The points p0 and p1 must live in the the same dimensional space as the mesh. """ # Validation: p0 and p1 live in the same dimensional space assert len(p0) == len(p1), "Dimension mismatch. len(p0) != len(p1)" # Validation: mesh and points live in the same dimensional space dimMesh = np.size(ccMesh[0,:]) assert len(p0) == dimMesh, "Dimension mismatch. len(p0) != dimMesh" if dimMesh == 1: # Define the reference points x1 = p0[0] x2 = p1[0] indX = (x1 <= ccMesh[:,0]) & (ccMesh[:,0] <= x2) ind = np.where(indX) elif dimMesh == 2: # Define the reference points x1 = p0[0] y1 = p0[1] x2 = p1[0] y2 = p1[1] indX = (x1 <= ccMesh[:,0]) & (ccMesh[:,0] <= x2) indY = (y1 <= ccMesh[:,1]) & (ccMesh[:,1] <= y2) ind = np.where(indX & indY) elif dimMesh == 3: # Define the points x1 = p0[0] y1 = p0[1] z1 = p0[2] x2 = p1[0] y2 = p1[1] z2 = p1[2] indX = (x1 <= ccMesh[:,0]) & (ccMesh[:,0] <= x2) indY = (y1 <= ccMesh[:,1]) & (ccMesh[:,1] <= y2) indZ = (z1 <= ccMesh[:,2]) & (ccMesh[:,2] <= z2) ind = np.where(indX & indY & indZ) # Return a tuple return ind def defineBlockConductivity(p0,p1,ccMesh,condVals): """ Build a block with the conductivity specified by condVal. Returns an array. condVals[0] conductivity of the block condVals[1] conductivity of the ground """ sigma = np.zeros(ccMesh.shape[0]) + condVals[1] ind = getIndecesBlock(p0,p1,ccMesh) sigma[ind] = condVals[0] return sigma def defineTwoLayeredConductivity(depth,ccMesh,condVals): """ Define a two layered model. Depth of the first layer must be specified. CondVals vector with the conductivity values of the layers. Eg: Convention to number the layers:: <----------------------------|------------------------------------> 0 depth zf 1st layer 2nd layer """ sigma = np.zeros(ccMesh.shape[0]) + condVals[1] dim = np.size(ccMesh[0,:]) p0 = np.zeros(dim) p1 = np.zeros(dim) # Identify 1st cell centered reference point p0[0] = ccMesh[0,0] if dim>1: p0[1] = ccMesh[0,1] if dim>2: p0[2] = ccMesh[0,2] # Identify the last cell-centered reference point p1[0] = ccMesh[-1,0] if dim>1: p1[1] = ccMesh[-1,1] if dim>2: p1[2] = ccMesh[-1,2] # The depth is always defined on the last one. p1[len(p1)-1] -= depth ind = getIndecesBlock(p0,p1,ccMesh) sigma[ind] = condVals[0]; return sigma def scalarConductivity(ccMesh,pFunction): """ Define the distribution conductivity in the mesh according to the analytical expression given in pFunction """ dim = np.size(ccMesh[0,:]) CC = [ccMesh[:,0]] if dim>1: CC.append(ccMesh[:,1]) if dim>2: CC.append(ccMesh[:,2]) sigma = pFunction(*CC) return sigma if __name__ == '__main__': from SimPEG.mesh import TensorMesh from matplotlib import pyplot as plt # Define the mesh testDim = 2 h1 = 0.3*np.ones(7) h1[0] = 0.5 h1[-1] = 0.6 h2 = .5 * np.ones(4) h3 = .4 * np.ones(6) x0 = np.zeros(3) if testDim == 1: h = [h1] x0 = x0[0] elif testDim == 2: h = [h1, h2] x0 = x0[0:2] else: h = [h1, h2, h3] M = TensorMesh(h, x0) ccMesh = M.gridCC # ------------------- Test conductivities! -------------------------- print('Testing 1 block conductivity') p0 = np.array([0.5,0.5,0.5])[:testDim] p1 = np.array([1.0,1.0,1.0])[:testDim] condVals = np.array([100,1e-6]) sigma = defineBlockConductivity(p0,p1,ccMesh,condVals) # Plot sigma model print sigma.shape M.plotImage(sigma) print 'Done with block! :)' plt.show() # ----------------------------------------- print('Testing the two layered model') condVals = np.array([100,1e-5]); depth = 1.0; sigma = defineTwoLayeredConductivity(depth,ccMesh,condVals) M.plotImage(sigma) print sigma print 'layer model!' plt.show() # ----------------------------------------- print('Testing scalar conductivity') if testDim == 1: pFunction = lambda x: np.exp(x) elif testDim == 2: pFunction = lambda x,y: np.exp(x+y) elif testDim == 3: pFunction = lambda x,y,z: np.exp(x+y+z) sigma = scalarConductivity(ccMesh,pFunction) # Plot sigma model M.plotImage(sigma) print sigma print 'Scalar conductivity defined!' plt.show() # -----------------------------------------