How to use 3D modeling code for time domain?

Thank you for your dedicated efforts in developing the framework. As a graduate student, I am currently utilizing SimPEG for my research, specifically focusing on studying 3D TDEM modeling code.

In my current work, I am conducting forward modeling using a 100 half-space model. To achieve this, I have implemented the “Trapezoidal waveform” with an on-time interval of 1.945 msec, and I have employed an OcTree mesh. Both the source and receiver locations have been positioned above 45 m from the surface. For a visual representation, please refer to the provided image.

Unfortunately, despite following the described modeling steps, I have encountered an issue where the predicted values are so instable.

SolvewWarning ### : Accuracy on solve is above tolerance: 5.8e-6 > 1e-6

Additionally, I am using the following line of code for simulation:
simulation = tdem.simulation.Simulation3DMagneticFluxDensity(
mesh, survey=survey, sigmaMap=model_map, Solver=Solver, t0 = 0)

To obtain the turn-off stage voltage response, I set value of t0 to 0. However this resulted in all the predicted values turning into zeros.

I would greatly appreciate any guidance or suggestions you can provide to help me overcome this problem.


he warning related to accuracy was due to the mesh padding size, and it was resolved by adjusting the padding size considering the diffusion depth.

However, the accuracy of the modeling results is still in doubt. To address this, the modeling results were compared to the analytic solution for a scenario where both the transmitter and receiver are on the surface.

I would appreciate it if you could let me know what issues exist in my code and any potential improvements that can be made. I have included the code below.

The comparison results are as follows:

The code I used is as follows:

Observation times for response (time channels)

n_times = 16
time_channels = np.logspace(-4.16, -2.5, n_times)

time_channels = np.logspace(-4, -2, n_times)

Defining transmitter locations

n_tx = 1
xtx, ytx, ztx = np.meshgrid([0.], [0.], [0.])
source_locations = np.c_[mkvc(xtx), mkvc(ytx), mkvc(ztx)]
ntx = np.size(xtx)

Define receiver locations

xrx, yrx, zrx = np.meshgrid([100.], [0.], [0.])
receiver_locations = np.c_[mkvc(xrx), mkvc(yrx), mkvc(zrx)]
source_list = # Create empty list to store sources

tx_pol_dir = “z”
rx_pol_dir = “z”

Impulse response

for ii in range(ntx):

# Here we define receivers that measure the h-field in A/m
dbzdt_receiver = tdem.receivers.PointMagneticFluxTimeDerivative(
    receiver_locations[ii, :], time_channels, rx_pol_dir
receivers_list = [
]  # Make a list containing all receivers even if just one

# Must define the transmitter properties and associated receivers

survey = tdem.Survey(source_list)

time_steps = [(1e-4, 20), (1e-5, 20), (1e-4, 20), (1e-3, 11)]

simulation = tdem.simulation.Simulation3DMagneticFluxDensity(
mesh, survey=survey, sigmaMap=model_map, solver=Solver)

simulation.time_steps = time_steps


Predict data for a given model = derivative of magnetic flux

dpred = simulation.dpred(model)

I’ve resolved the issue regarding above result. However, to apply it to various situations, I need to consider the grid size and time stepping.


1 Like