diff --git a/SimPEG/EMforward.py b/SimPEG/EMforward.py new file mode 100644 index 00000000..fc143841 --- /dev/null +++ b/SimPEG/EMforward.py @@ -0,0 +1,49 @@ +import numpy as np +from utils import mkvc +import scipy.sparse.linalg.dsolve as dsl + +def getMisfit(m,mesh,forward): + + mu0 = 4*np.pi*1e-7 + omega = forward['omega'] #[param['indomega']] + rhs = forward['rhs'] #[:,param['indrhs']] + misfit = 0 + + # Maxwell's system for E + for i in range(len(omega)): + for j in range(rhs.shape[1]): + Curl = mesh.edgeCurl + #Grad = mesh.nodalGrad + sigma = np.exp(m) + Me,PP = mesh.getEdgeMass(sigma) + Mf = 1/mu0 * mesh.getFaceMass() # assume mu = mu0 + + A = Curl.T * Mf * Curl - 1j * omega[i] * Me + b = mkvc(np.array(rhs[:,j])) + e = dsl.spsolve(A,b) + e = mkvc(e,2) + #print np.linalg.norm(A*e-b)/np.linalg.norm(b) + P = forward['projection'] + d = P*e + r = mkvc(d - param.dobs[i,j,:],2) + + mis = mis + 0.5*(r.T*r) + # get derivatives + lam = dsl.spsolve(A.T,P.T*r) + Gij = PP.T*diag((PP*e)*mesh.vol) + dmis = dmis - Gij.T*lam + + + + +if __name__ == '__main__': + from TensorMesh import TensorMesh + h = [np.ones(7),np.ones(8),np.ones(9)] + mesh = TensorMesh(h) + ne = np.sum(mesh.nE) + Q = np.matrix(np.random.randn(ne,5)) + P = np.matrix(Q.T) + forward = {'omega':[1,2,3], 'rhs':Q,'projection':P} + + m = np.ones(mesh.nC) + getMisfit(m,mesh,forward)