minor changes to tdem writeup and code (still buggy!)

This commit is contained in:
rowanc1
2014-02-12 15:02:55 -08:00
parent 99157a89c8
commit 732ff882e0
4 changed files with 107 additions and 103 deletions
+38 -5
View File
@@ -2,16 +2,49 @@
.. math::
\newcommand{\dcurl}{{\mathbf C}}
\renewcommand {\b} { {\vec b} }
\newcommand {\e} { {\vec e} }
\renewcommand {\j} { {\vec j} }
\renewcommand{\div}{\nabla\cdot\,}
\newcommand{\grad}{\vec \nabla}
\newcommand{\curl}{{\vec \nabla}\times\,}
\newcommand {\J}{{\vec J}}
\renewcommand{\H}{{\vec H}}
\newcommand {\E}{{\vec E}}
\newcommand{\dcurl}{{\mathbf C}}
\newcommand{\dgrad}{{\mathbf G}}
\newcommand{\Acf}{{\mathbf A_c^f}}
\newcommand{\Ace}{{\mathbf A_c^e}}
\renewcommand{\S}{{\mathbf \Sigma}}
\newcommand{\St}{{\mathbf \Sigma_\tau}}
\newcommand{\T}{{\mathbf T}}
\newcommand{\Tt}{{\mathbf T_\tau}}
\newcommand{\diag}[1]{\,{\sf diag}\left( #1 \right)}
\newcommand{\M}{{\mathbf M}}
\newcommand{\MfMui}{{\M^f_{\mu^{-1}}}}
\newcommand{\MeSig}{{\M^e_\sigma}}
\newcommand{\MeSigInf}{{\M^e_{\sigma_\infty}}}
\newcommand{\MeSigO}{{\M^e_{\sigma_0}}}
\newcommand{\Me}{{\M^e}}
\newcommand{\Mes}[1]{{\M^e_{#1}}}
\newcommand{\Mee}{{\M^e_e}}
\newcommand{\Mej}{{\M^e_j}}
\newcommand{\BigO}[1]{\mathcal{O}\bigl(#1\bigr)}
\newcommand{\bE}{\mathbf{E}}
\newcommand{\bH}{\mathbf{H}}
\newcommand{\B}{\vec{B}}
\newcommand{\D}{\vec{D}}
\renewcommand{\H}{\vec{H}}
\newcommand{\s}{\vec{s}}
\newcommand{\bfJ}{\bf{J}}
\newcommand{\vecm}{\vec m}
\renewcommand{\Re}{\mathsf{Re}}
\renewcommand{\Im}{\mathsf{Im}}
\renewcommand {\j} { {\vec j} }
\newcommand {\h} { {\vec h} }
\renewcommand {\b} { {\vec b} }
\newcommand {\e} { {\vec e} }
\renewcommand {\d} { {\vec d} }
\renewcommand {\u} { {\vec u} }
\newcommand{\I}{\vec{I}}
+44 -40
View File
@@ -1,33 +1,33 @@
\documentclass[]{article}
\renewcommand{\div}{\nabla\cdot\,}
\newcommand{\grad}{\ensuremath {\vec \nabla}}
\newcommand{\curl}{\ensuremath{{\vec \nabla}\times\,}}
\newcommand {\J} { {\vec J} }
\renewcommand {\H} { {\vec H} }
\newcommand {\E} { {\vec E} }
\newcommand{\dcurl}{\ensuremath{{\mathbf C}}}
\newcommand{\dgrad}{\ensuremath{{\mathbf G}}}
\newcommand{\Acf}{\ensuremath{{\mathbf A_c^f}}}
\newcommand{\Ace}{\ensuremath{{\mathbf A_c^e}}}
\renewcommand{\S}{\ensuremath{{\mathbf \Sigma}}}
\newcommand{\St}{\ensuremath{{\mathbf \Sigma_\tau}}}
\newcommand{\T}{\ensuremath{{\mathbf T}}}
\newcommand{\Tt}{\ensuremath{{\mathbf T_\tau}}}
\newcommand{\diag}[1]{\, {\sf diag}\left( #1 \right)}
\newcommand{\grad}{\vec \nabla}
\newcommand{\curl}{{\vec \nabla}\times\,}
\newcommand {\J}{{\vec J}}
\renewcommand{\H}{{\vec H}}
\newcommand {\E}{{\vec E}}
\newcommand{\dcurl}{{\mathbf C}}
\newcommand{\dgrad}{{\mathbf G}}
\newcommand{\Acf}{{\mathbf A_c^f}}
\newcommand{\Ace}{{\mathbf A_c^e}}
\renewcommand{\S}{{\mathbf \Sigma}}
\newcommand{\St}{{\mathbf \Sigma_\tau}}
\newcommand{\T}{{\mathbf T}}
\newcommand{\Tt}{{\mathbf T_\tau}}
\newcommand{\diag}[1]{\,{\sf diag}\left( #1 \right)}
%Common mass matricies
\newcommand{\M}{\ensuremath{{\mathbf M}}}
\newcommand{\MfMui}{\ensuremath{{\M^f_{\mu^{-1}}}}}
\newcommand{\MeSig}{\ensuremath{{\M^e_\sigma}}}
\newcommand{\MeSigInf}{\ensuremath{{\M^e_{\sigma_\infty}}}}
\newcommand{\MeSigO}{\ensuremath{{\M^e_{\sigma_0}}}}
\newcommand{\Me}{\ensuremath{{\M^e}}}
\newcommand{\Mes}[1]{\ensuremath{{\M^e_{#1}}}}
\newcommand{\Mee}{\ensuremath{{\M^e_e}}}
\newcommand{\Mej}{\ensuremath{{\M^e_j}}}
\newcommand{\M}{{\mathbf M}}
\newcommand{\MfMui}{{\M^f_{\mu^{-1}}}}
\newcommand{\MeSig}{{\M^e_\sigma}}
\newcommand{\MeSigInf}{{\M^e_{\sigma_\infty}}}
\newcommand{\MeSigO}{{\M^e_{\sigma_0}}}
\newcommand{\Me}{{\M^e}}
\newcommand{\Mes}[1]{{\M^e_{#1}}}
\newcommand{\Mee}{{\M^e_e}}
\newcommand{\Mej}{{\M^e_j}}
\newcommand{\BigO}[1]{\ensuremath{\mathcal{O}\bigl(#1\bigr)}}
\newcommand{\BigO}[1]{\mathcal{O}\bigl(#1\bigr)}
% ********** TDIP paper
@@ -75,27 +75,27 @@ Using Gauss-Newton to solve the inverse problem requires the ability to calculat
where
\begin{subequations}
\begin{align}
\mathbf{A} =
\mathbf{A} =
\left[
\begin{array}{cc}
\frac{1}{\delta t} \mathbf{I} & \dcurl \\
\dcurl^\top & -\MeSig
\dcurl^\top \MfMui & -\MeSig
\end{array}
\right] \\
\mathbf{B} =
\mathbf{B} =
\left[
\begin{array}{cc}
-\frac{1}{\delta t} \mathbf{I} & 0 \\
0 & 0
\end{array}
\right] \\
\u^{(k)} = \left[
\u^{(k)} = \left[
\begin{array}{c}
\b^{(k)}\\
\e^{(k)}
\end{array}
\right] \\
\s^{(k)} = \left[
\s^{(k)} = \left[
\begin{array}{c}
0\\
\Me \j^{(k)}_s
@@ -153,7 +153,7 @@ Defining the function $\vec{c}(m,\vec{u})$ to be
\end{align}
then
\begin{align}
\frac{\partial \vec{c}}{\partial m} \partial m
\frac{\partial \vec{c}}{\partial m} \partial m
+ \frac{\partial \vec{c}}{\partial \u} \partial \vec{u} = 0
\end{align}
or
@@ -168,8 +168,8 @@ Differentiating, we find that
\end{align}
and
\begin{align}
\frac{\partial \vec{c}}{\partial \sigma} = \mathbf{G}_\sigma =
\left[
\frac{\partial \vec{c}}{\partial \sigma} = \mathbf{G}_\sigma =
\left[
\begin{array}{c}
g_\sigma^{(1)}\\
g_\sigma^{(2)}\\
@@ -181,8 +181,8 @@ and
with
\begin{subequations}
\begin{align}
g_\sigma^{(n)} =
\left[
g_\sigma^{(n)} =
\left[
\begin{array}{c}
\mathbf{0} \\
- \diag{\e^{(n)}} \Ace \diag{\vec{V}}
@@ -215,7 +215,7 @@ Multiplying $\mathbf{J}$ onto a vector can be broken into three steps
\begin{subequations}
\begin{align}
\frac{1}{\delta t} \vec{y}_{b}^{(1)} + \dcurl \vec{y}_{e}^{(1)} = 0 \\
\dcurl \vec{y}_{e}^{(1)} + \frac{1}{\delta t} \vec{y}_{b}^{(1)} = 0 \\
\dcurl^\top \MfMui \vec{y}_b^{(1)} - \MeSig \vec{y}_e^{(1)} = \vec{p}_e^{(1)}
\end{align}
\end{subequations}
@@ -231,14 +231,18 @@ Multiplying $\mathbf{J}$ onto a vector can be broken into three steps
\begin{subequations}
\begin{align}
\dcurl \vec{y}_{e}^{(t+1)} + \frac{1}{\delta t} \vec{y}_{b}^{(t+1)} - \frac{1}{\delta t} \vec{y}_{b}^{(t)} = 0 \\
\vec{y}_e^{(t+1)} = \MeSig^{-1} \dcurl^\top \MfMui \vec{y}_b^{(t+1)} - \MeSig^{-1} \vec{p}_e^{(t+1)}
\dcurl \vec{y}_{e}^{(t+1)} + \frac{1}{\delta t} \vec{y}_{b}^{(t+1)}
{\color{red}- \frac{1}{\delta t} \vec{y}_{b}^{(t)} }
= 0 \\
\dcurl^\top \MfMui \vec{y}_b^{(t+1)} - \MeSig \vec{y}_e^{(t+1)} = \vec{p}_e^{(t+1)}
\end{align}
\end{subequations}
\begin{subequations}
\begin{align}
\left( \MfMui \dcurl \MeSig^{-1} \dcurl^\top \MfMui + \frac{1}{\delta t} \MfMui \right) \vec{y}_{b}^{(1)} = \frac{1}{\delta t} \MfMui \vec{y}_b^{(t)} + \MfMui \dcurl \MeSig^{-1} \vec{p}_e^{(1)} \\
\left( \MfMui \dcurl \MeSig^{-1} \dcurl^\top \MfMui + \frac{1}{\delta t} \MfMui \right) \vec{y}_{b}^{(t+1)} =
{\color{red} \frac{1}{\delta t} \MfMui \vec{y}_b^{(t)} }
+ \MfMui \dcurl \MeSig^{-1} \vec{p}_e^{(t+1)} \\
\vec{y}_e^{(t+1)} = \MeSig^{-1} \dcurl^\top \MfMui \vec{y}_b^{(t+1)} - \MeSig^{-1} \vec{p}_e^{(t+1)}
\end{align}
\end{subequations}
@@ -247,4 +251,4 @@ Multiplying $\mathbf{J}$ onto a vector can be broken into three steps
\end{document}
\end{document}
+1 -1
View File
@@ -3,7 +3,7 @@ from SimPEG.Problem import BaseProblem
from simpegEM.Utils import Sources
from FieldsTDEM import FieldsTDEM
from scipy.constants import mu_0
from SimPEG.Utils import sdiag
from SimPEG.Utils import sdiag, mkvc
import numpy as np
+24 -57
View File
@@ -16,7 +16,7 @@ class ProblemTDEM_b(ProblemBaseTDEM):
ProblemBaseTDEM.__init__(self, mesh, model, **kwargs)
solType = 'b'
####################################################
# Internal Methods
####################################################
@@ -56,19 +56,19 @@ class ProblemTDEM_b(ProblemBaseTDEM):
ei = u.get_e(i)
pVal = np.empty_like(ei)
for j in range(ei.shape[1]):
pVal[:,j] = -ei[:,j]*c
pVal[:,j] = -ei[:,j]*c
p.set_e(pVal,i)
p.set_b(np.zeros((self.mesh.nF,1)), i)
return p
def solveAh(self, m, p):
def AhRHS(tInd, u):
rhs = self.MfMui*self.mesh.edgeCurl*self.MeSigmaI*p.get_e(tInd)
if tInd == 0:
return self.MfMui*self.mesh.edgeCurl*self.MeSigmaI*p.get_e(tInd)
else:
dt = self.getDt(tInd)
return self.MfMui*self.mesh.edgeCurl*self.MeSigmaI*p.get_e(tInd) + 1./dt*self.MfMui*u.get_b(tInd-1)
return rhs
dt = self.getDt(tInd)
return rhs + 1./dt*self.MfMui*u.get_b(tInd-1)
def AhCalcFields(sol, solType, tInd):
b = sol
@@ -126,61 +126,28 @@ if __name__ == '__main__':
prb = EM.TDEM.ProblemTDEM_b(mesh, model)
# prb.setTimes([1e-5, 5e-5, 2.5e-4], [150, 150, 150])
prb.setTimes([1e-5, 5e-5, 2.5e-4], [10, 10, 10])
# prb.setTimes([1e-5], [10])
# prb.setTimes([1e-5, 5e-5, 2.5e-4], [10, 10, 10])
prb.setTimes([1e-5], [1])
prb.pair(dat)
# sigma = np.ones(mesh.nCz)*1e-8
# sigma[mesh.vectorCCz<0] = 0.1
# u = prb.fields(sigma)
# Ahu = prb.AhVec(sigma, u)
# Random fields
sigma = np.random.rand(mesh.nCz)
# f = FieldsTDEM(prb.mesh, 1, prb.times.size, 'b')
# for i in range(f.nTimes):
# f.set_b(np.random.rand(mesh.nF, 1), i)
# f.set_e(np.random.rand(mesh.nE, 1), i)
f = prb.fields(sigma)
dm = np.random.rand(mesh.nCz)
for h in np.logspace(0, -10, 10):
# print h
a = np.linalg.norm(prb.AhVec(sigma+h*dm, f).fieldVec() - prb.AhVec(sigma, f).fieldVec())
b = np.linalg.norm(prb.AhVec(sigma+h*dm, f).fieldVec() - prb.AhVec(sigma, f).fieldVec() - h*prb.G(sigma, dm, u=f).fieldVec())
print a, b, b/a
# print
# h = 1.
plt.semilogy(np.abs(prb.AhVec(sigma+h*dm,f).fieldVec() - prb.AhVec(sigma, f).fieldVec()), 'ko')
plt.semilogy(np.abs(h*prb.G(sigma, dm, u=f).fieldVec()), 'rx')
# plt.semilogy(prb.AhVec(sigma+h*dm, f).fieldVec() - prb.AhVec(sigma, f).fieldVec() - h*prb.G(sigma, dm, u=f).fieldVec(),'ko')
f = FieldsTDEM(prb.mesh, 1, prb.times.size, 'b')
for i in range(f.nTimes):
f.set_b(np.zeros((mesh.nF, 1)), i)
f.set_e(np.random.rand(mesh.nE, 1), i)
Ahf = prb.AhVec(sigma, f)
f_test = prb.solveAh(sigma, Ahf)
e0 = f.get_e(0)
e1 = f_test.get_e(0)
b0 = f.get_b(0)
b1 = f_test.get_b(0)
plt.semilogy(np.abs(e0))
plt.semilogy(np.abs(e1),'r')
plt.show()
# plt.show()
# f = prb.fields(sigma)
# print f.fieldVec()
# prb.AhVec(sigma,f)
# prb.G(prb.sigma, prb.sigma)
# prb.solveAh(prb.sigma, f)
# prb.J(prb.sigma, prb.sigma, f)
# from SimPEG.Tests import checkDerivative
# m0 = sigma
# dx = np.zeros_like(sigma)
# dx[prb.mesh.vectorCCz<0] = 1e-4
# derChk = lambda m: [dat.dpred(m), lambda mx: prb.J(m0, mx, u=f)]
# passed = checkDerivative(derChk, m0, dx=dx, plotIt=False)
# bz_calc = dat.dpred(sigma)
# bz_ana = mu_0*hzAnalyticDipoleT(dat.rxLoc[0], prb.times, sigma[0])
# plt.loglog(prb.times, np.abs(bz_calc.flatten()), label='TDEM_b')
# plt.loglog(prb.times, np.abs(bz_ana), 'r', label='Analytic')
# plt.legend()
# plt.show()