.. DO NOT EDIT. .. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY. .. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE: .. "content/examples/06-tdem/plot_fwd_tdem_inductive_src_permeable_target.py" .. LINE NUMBERS ARE GIVEN BELOW. .. only:: html .. note:: :class: sphx-glr-download-link-note :ref:`Go to the end ` to download the full example code .. rst-class:: sphx-glr-example-title .. _sphx_glr_content_examples_06-tdem_plot_fwd_tdem_inductive_src_permeable_target.py: EM: TDEM: Permeable Target, Inductive Source ============================================ In this example, we demonstrate 2 approaches for simulating TDEM data when a permeable target is present in the simulation domain. In the first, we use a step-on waveform (QuarterSineRampOnWaveform) and look at the magnetic flux at a late on-time. In the second, we solve the magnetostatic problem to compute the initial magnetic flux so that a step-off waveform may be used. A cylindrically symmetric mesh is employed and a circular loop source is used .. GENERATED FROM PYTHON SOURCE LINES 13-29 .. code-block:: default import discretize import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import LogNorm from scipy.constants import mu_0 try: from pymatsolver import Pardiso as Solver except ImportError: from SimPEG import SolverLU as Solver import time from SimPEG.electromagnetics import time_domain as TDEM from SimPEG import utils, maps, Report .. GENERATED FROM PYTHON SOURCE LINES 30-35 Model Parameters ---------------- Here, we define our simulation parameters. The target has a relative permeability of 100 :math:`\mu_0` .. GENERATED FROM PYTHON SOURCE LINES 35-45 .. code-block:: default target_mur = 100 # permeability of the target target_l = 500 # length of target target_r = 50 # radius of the target sigma_back = 1e-5 # conductivity of the background radius_loop = 100 # radius of the transmitter loop .. GENERATED FROM PYTHON SOURCE LINES 46-50 Mesh ---- Next, we create a cylindrically symmteric tensor mesh .. GENERATED FROM PYTHON SOURCE LINES 50-78 .. code-block:: default csx = 5.0 # core cell size in the x-direction csz = 5.0 # core cell size in the z-direction domainx = 100 # use a uniform cell size out to a radius of 100m # padding parameters npadx, npadz = 15, 15 # number of padding cells pfx = 1.4 # expansion factor for the padding to infinity in the x-direction pfz = 1.4 # expansion factor for the padding to infinity in the z-direction ncz = int(target_l / csz) # number of z cells in the core region # create the cyl mesh mesh = discretize.CylindricalMesh( [ [(csx, int(domainx / csx)), (csx, npadx, pfx)], 1, [(csz, npadz, -pfz), (csz, ncz), (csz, npadz, pfz)], ] ) # put the origin at the top of the target mesh.x0 = [0, 0, -mesh.h[2][: npadz + ncz].sum()] # plot the mesh mesh.plot_grid() .. image-sg:: /content/examples/06-tdem/images/sphx_glr_plot_fwd_tdem_inductive_src_permeable_target_001.png :alt: plot fwd tdem inductive src permeable target :srcset: /content/examples/06-tdem/images/sphx_glr_plot_fwd_tdem_inductive_src_permeable_target_001.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none .. GENERATED FROM PYTHON SOURCE LINES 79-80 Assign physical properties on the mesh .. GENERATED FROM PYTHON SOURCE LINES 80-92 .. code-block:: default mur_model = np.ones(mesh.nC) # find the indices of the target x_inds = mesh.gridCC[:, 0] < target_r z_inds = (mesh.gridCC[:, 2] <= 0) & (mesh.gridCC[:, 2] >= -target_l) mur_model[x_inds & z_inds] = target_mur mu_model = mu_0 * mur_model sigma = np.ones(mesh.nC) * sigma_back .. GENERATED FROM PYTHON SOURCE LINES 93-94 Plot the models .. GENERATED FROM PYTHON SOURCE LINES 94-117 .. code-block:: default xlim = np.r_[-200, 200] # x-limits in meters zlim = np.r_[-1.5 * target_l, 10.0] # z-limits in meters. (z-positive up) fig, ax = plt.subplots(1, 1, figsize=(6, 5)) # plot the permeability plt.colorbar( mesh.plot_image( mur_model, ax=ax, pcolor_opts={"norm": LogNorm()}, # plot on a log-scale mirror=True, )[0], ax=ax, ) ax.plot(np.r_[radius_loop], np.r_[0.0], "wo", markersize=8) ax.plot(np.r_[-radius_loop], np.r_[0.0], "wx", markersize=8) ax.set_title("Relative permeability", fontsize=13) ax.set_xlim(xlim) ax.set_ylim(zlim) .. image-sg:: /content/examples/06-tdem/images/sphx_glr_plot_fwd_tdem_inductive_src_permeable_target_002.png :alt: Relative permeability :srcset: /content/examples/06-tdem/images/sphx_glr_plot_fwd_tdem_inductive_src_permeable_target_002.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none (-750.0, 10.0) .. GENERATED FROM PYTHON SOURCE LINES 118-124 Waveform for the Long On-Time Simulation ---------------------------------------- Here, we define our time-steps for the simulation where we will use a waveform with a long on-time to reach a steady-state magnetic field and define a quarter-sine ramp-on waveform as our transmitter waveform .. GENERATED FROM PYTHON SOURCE LINES 124-153 .. code-block:: default ramp = [ (1e-5, 20), (1e-4, 20), (3e-4, 20), (1e-3, 20), (3e-3, 20), (1e-2, 20), (3e-2, 20), (1e-1, 20), (3e-1, 20), (1, 50), ] time_mesh = discretize.TensorMesh([ramp]) # define an off time past when we will simulate to keep the transmitter on off_time = 100 quarter_sine = TDEM.Src.QuarterSineRampOnWaveform( ramp_on=np.r_[0.0, 3], ramp_off=off_time - np.r_[1.0, 0] ) # evaluate the waveform at each time in the simulation quarter_sine_plt = [quarter_sine.eval(t) for t in time_mesh.gridN] fig, ax = plt.subplots(1, 1, figsize=(6, 4)) ax.plot(time_mesh.gridN, quarter_sine_plt) ax.plot(time_mesh.gridN, np.zeros(time_mesh.nN), "k|", markersize=2) ax.set_title("quarter sine waveform") .. image-sg:: /content/examples/06-tdem/images/sphx_glr_plot_fwd_tdem_inductive_src_permeable_target_003.png :alt: quarter sine waveform :srcset: /content/examples/06-tdem/images/sphx_glr_plot_fwd_tdem_inductive_src_permeable_target_003.png :class: sphx-glr-single-img .. rst-class:: sphx-glr-script-out .. code-block:: none Text(0.5, 1.0, 'quarter sine waveform') .. GENERATED FROM PYTHON SOURCE LINES 154-159 Sources for the 2 simulations ----------------------------- We use two sources, one for the magnetostatic simulation and one for the ramp on simulation. .. GENERATED FROM PYTHON SOURCE LINES 159-180 .. code-block:: default # For the magnetostatic simulation. The default waveform is a step-off src_magnetostatic = TDEM.Src.CircularLoop( [], location=np.r_[0.0, 0.0, 0.0], orientation="z", radius=100, ) # For the long on-time simulation. We use the ramp-on waveform src_ramp_on = TDEM.Src.CircularLoop( [], location=np.r_[0.0, 0.0, 0.0], orientation="z", radius=100, waveform=quarter_sine, ) src_list_magnetostatic = [src_magnetostatic] src_list_ramp_on = [src_ramp_on] .. GENERATED FROM PYTHON SOURCE LINES 181-186 Create the simulations ---------------------- To simulate magnetic flux data, we use the b-formulation of Maxwell's equations .. GENERATED FROM PYTHON SOURCE LINES 186-205 .. code-block:: default survey_magnetostatic = TDEM.Survey(source_list=src_list_magnetostatic) survey_ramp_on = TDEM.Survey(src_list_ramp_on) prob_magnetostatic = TDEM.Simulation3DMagneticFluxDensity( mesh=mesh, survey=survey_magnetostatic, sigmaMap=maps.IdentityMap(mesh), time_steps=ramp, solver=Solver, ) prob_ramp_on = TDEM.Simulation3DMagneticFluxDensity( mesh=mesh, survey=survey_ramp_on, sigmaMap=maps.IdentityMap(mesh), time_steps=ramp, solver=Solver, ) .. GENERATED FROM PYTHON SOURCE LINES 206-208 Run the long on-time simulation ------------------------------- .. GENERATED FROM PYTHON SOURCE LINES 208-221 .. code-block:: default t = time.time() print("--- Running Long On-Time Simulation ---") prob_ramp_on.mu = mu_model fields = prob_ramp_on.fields(sigma) print(" ... done. Elapsed time {}".format(time.time() - t)) print("\n") # grab the last time-step in the simulation b_ramp_on = utils.mkvc(fields[:, "b", -1]) .. rst-class:: sphx-glr-script-out .. code-block:: none --- Running Long On-Time Simulation --- ... done. Elapsed time 1.8395934104919434 .. GENERATED FROM PYTHON SOURCE LINES 222-224 Compute Magnetostatic Fields from the step-off source ----------------------------------------------------- .. GENERATED FROM PYTHON SOURCE LINES 224-230 .. code-block:: default prob_magnetostatic.mu = mu_model prob_magnetostatic.model = sigma b_magnetostatic = src_magnetostatic.bInitial(prob_magnetostatic) .. GENERATED FROM PYTHON SOURCE LINES 231-233 Plot the results ----------------------------------------------------- .. GENERATED FROM PYTHON SOURCE LINES 233-295 .. code-block:: default def plotBFieldResults( ax=None, clim_min=None, clim_max=None, max_depth=1.5 * target_l, max_r=100, top=10.0, view="magnetostatic", ): if ax is None: plt.subplots(1, 1, figsize=(6, 7)) assert view.lower() in ["magnetostatic", "late_ontime", "diff"] xlim = max_r * np.r_[-1, 1] # x-limits in meters zlim = np.r_[-max_depth, top] # z-limits in meters. (z-positive up) clim = None if clim_max is not None and clim_max != 0.0: clim = clim_max * np.r_[-1, 1] if clim_min is not None and clim_min != 0.0: clim[0] = clim_min if view == "magnetostatic": plotme = b_magnetostatic elif view == "late_ontime": plotme = b_ramp_on elif view == "diff": plotme = b_magnetostatic - b_ramp_on cb = plt.colorbar( mesh.plot_image( plotme, view="vec", v_type="F", ax=ax, range_x=xlim, range_y=zlim, sample_grid=np.r_[np.diff(xlim) / 100.0, np.diff(zlim) / 100.0], mirror=True, pcolor_opts={"norm": LogNorm()}, )[0], ax=ax, ) ax.set_title("{}".format(view), fontsize=13) ax.set_xlim(xlim) ax.set_ylim(zlim) cb.update_ticks() return ax fig, ax = plt.subplots(1, 3, figsize=(12, 5)) for a, v in zip(ax, ["magnetostatic", "late_ontime", "diff"]): a = plotBFieldResults(ax=a, clim_min=1e-15, clim_max=1e-7, view=v, max_r=200) plt.tight_layout() .. image-sg:: /content/examples/06-tdem/images/sphx_glr_plot_fwd_tdem_inductive_src_permeable_target_004.png :alt: magnetostatic, late_ontime, diff :srcset: /content/examples/06-tdem/images/sphx_glr_plot_fwd_tdem_inductive_src_permeable_target_004.png :class: sphx-glr-single-img .. GENERATED FROM PYTHON SOURCE LINES 296-299 Print the version of SimPEG and dependencies -------------------------------------------- .. GENERATED FROM PYTHON SOURCE LINES 299-302 .. code-block:: default plt.show() Report() .. raw:: html
Wed Sep 06 18:22:46 2023 UTC
OS Linux CPU(s) 2 Machine x86_64
Architecture 64bit RAM 6.8 GiB Environment Python
File system ext4
Python 3.8.17 | packaged by conda-forge | (default, Jun 16 2023, 07:06:00) [GCC 11.4.0]
SimPEG 0.20.0.post2 discretize 0.9.0 pymatsolver 0.2.0
numpy 1.24.4 scipy 1.10.1 sklearn 1.3.0
matplotlib 3.7.2 empymod 2.2.2 geoana 0.5.0
pandas 2.0.3 pydiso 0.0.3 numba 0.57.1
dask 2023.5.0 sympy 1.12 IPython 8.12.2
ipywidgets 8.1.0 plotly 5.16.1 vtk 9.2.6
memory_profiler 0.61.0


.. rst-class:: sphx-glr-timing **Total running time of the script:** (0 minutes 10.194 seconds) **Estimated memory usage:** 8 MB .. _sphx_glr_download_content_examples_06-tdem_plot_fwd_tdem_inductive_src_permeable_target.py: .. only:: html .. container:: sphx-glr-footer sphx-glr-footer-example .. container:: sphx-glr-download sphx-glr-download-python :download:`Download Python source code: plot_fwd_tdem_inductive_src_permeable_target.py ` .. container:: sphx-glr-download sphx-glr-download-jupyter :download:`Download Jupyter notebook: plot_fwd_tdem_inductive_src_permeable_target.ipynb ` .. only:: html .. rst-class:: sphx-glr-signature `Gallery generated by Sphinx-Gallery `_