{
  "cells": [
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "%matplotlib notebook"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "\nTransform utilities within empymod for other modellers\n======================================================\n\nThis is an example how you can use the Fourier-transform tools implemented in\n``empymod`` with other modellers. You could achieve the same for the Hankel\ntransform.\n\n``empymod`` has various Fourier transforms implemented:\n\n  - Digital Linear Filters DLF (Sine/Cosine)\n  - Quadrature with Extrapolation QWE\n  - Logarithmic Fast Fourier Transform FFTLog\n  - Fast Fourier Transform FFT\n\n\nFor details of all the parameters see the ``empymod``-docs or the function's\ndocstrings.\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "import empymod\nimport numpy as np\nimport matplotlib.pyplot as plt\nplt.style.use('ggplot')"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Model and transform parameters\n------------------------------\n\nThe model actually doesn't matter for our purpose, but we need some model to\nshow how it works.\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "# Define model, a halfspace\nmodel = {\n    'src': [0, 0, 0.001],     # Source at origin, slightly below interface\n    'rec': [6000, 0, 0.001],  # Receivers in-line, 0.5m below interface\n    'depth': [0],             # Air interface\n    'res': [2e14, 1],         # Resistivity: [air, half-space]\n    'epermH': [0, 1],         # Set el. perm. of air to 0 because of num. noise\n}\n\n# Specify desired times\ntime = np.linspace(0.1, 30, 301)\n\n# Desired time-domain signal (0: impulse; 1: step-on; -1: step-off)\nsignal = 1\n\n# Get required frequencies to model this time-domain result\n# => we later need ``ft`` and ``ftarg`` for the Fourier transform.\n# => See the docstrings (e.g., empymod.model.dipole) for available transforms\n#    and their arguments.\ntime, freq, ft, ftarg = empymod.utils.check_time(\n        time=time, signal=signal, ft='dlf', ftarg={}, verb=3)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Frequency-domain computation\n----------------------------\n\n**=> Here we compute the frequency-domain result with `empymod`, but you\ncould compute it with any other modeller.**\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "fresp = empymod.dipole(freqtime=freq, **model)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Plot frequency-domain result\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "plt.figure()\n\nplt.title('Frequency Domain')\nplt.plot(freq, 1e9*fresp.real, 'C0.', label='Req. real frequencies')\nplt.plot(freq, 1e9*fresp.imag, 'C1.', label='Req. imag frequencies')\nplt.legend()\nplt.xscale('log')\nplt.xlabel('Frequency (Hz)')\nplt.ylabel('$E_x$ (nV/m)')\n\nplt.show()"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Fourier transform\n-----------------\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "# Compute corresponding time-domain signal.\ntresp, _ = empymod.model.tem(\n    fEM=fresp[:, None],\n    off=np.array(model['rec'][0]),\n    freq=freq,\n    time=time,\n    signal=signal,\n    ft=ft,\n    ftarg=ftarg)\n\ntresp = np.squeeze(tresp)\n\n# Time-domain result just using empymod\ntresp2 = empymod.dipole(freqtime=time, signal=signal, verb=1, **model)"
      ]
    },
    {
      "cell_type": "markdown",
      "metadata": {},
      "source": [
        "Plot time-domain result\n\n"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "fig = plt.figure()\n\nplt.title('Time domain')\nplt.plot(time, tresp2*1e12, 'k', lw=2, label='empymod')\nplt.plot(time, tresp*1e12, 'C0--', label='manual Fourier transform')\nplt.legend()\nplt.xlabel('Time (s)')\nplt.ylabel('$E_x$ (uV/m)')\n\nplt.show()"
      ]
    },
    {
      "cell_type": "code",
      "execution_count": null,
      "metadata": {
        "collapsed": false
      },
      "outputs": [],
      "source": [
        "empymod.Report()"
      ]
    }
  ],
  "metadata": {
    "kernelspec": {
      "display_name": "Python 3",
      "language": "python",
      "name": "python3"
    },
    "language_info": {
      "codemirror_mode": {
        "name": "ipython",
        "version": 3
      },
      "file_extension": ".py",
      "mimetype": "text/x-python",
      "name": "python",
      "nbconvert_exporter": "python",
      "pygments_lexer": "ipython3",
      "version": "3.7.3"
    }
  },
  "nbformat": 4,
  "nbformat_minor": 0
}