├── .gitignore
├── 1702_Step_by_step_NMO
├── .gitignore
├── README.md
├── abstract.tex
├── bibliography
│ ├── .placeholder.md
│ └── biblio.bib
├── data
│ └── synthetic_cmp.npz
├── environment.yml
├── figures
│ ├── .placeholder.md
│ ├── nmo-application
│ │ ├── caption.tex
│ │ ├── config.yml
│ │ ├── nmo-application.png
│ │ └── nmo-application_original.png
│ └── sketch-interpolation
│ │ ├── caption.tex
│ │ ├── config.yml
│ │ ├── sketch-interpolation.png
│ │ └── sketch-interpolation_original.png
├── header.tex
├── how-to-nmo.tex
├── intro.tex
├── layout.md
├── step-by-step-nmo.ipynb
├── thanks.tex
├── the-code-of-nmo.tex
├── title.md
└── title.tex
├── 1704_Getting_started_with_CSEM
├── LICENSE
├── Manuscript.ipynb
├── Notebook.ipynb
├── README.rst
└── figures
│ ├── anisotropy.png
│ ├── commonsourcegather.png
│ ├── freqtime.png
│ ├── interactive_edit.png
│ └── model.png
├── 1706_Seismic_rock_physics
├── manuscript
│ ├── Figure_1_AADM.pdf
│ ├── Figure_1_AADM.png
│ ├── Figure_2_AADM.pdf
│ ├── Figure_2_AADM.png
│ ├── Figure_3_AADM.pdf
│ ├── Figure_3_AADM.png
│ ├── Figure_4_AADM.pdf
│ ├── Figure_4_AADM.png
│ ├── seismic_rock_physics.docx
│ ├── seismic_rock_physics.md
│ ├── seismic_rock_physics.pdf
│ └── seismic_rock_physics_figures.py
├── qsiwell5.csv
└── seismic_rock_physics.ipynb
├── 1708_Nonlinear_inversion
├── .gitignore
├── 1_MT1D_NumericalSetup.ipynb
├── 2_MT1D_ForwardModellingAndNonuniqueness.ipynb
├── 3_MT1D_5layer_inversion.ipynb
├── Appendix_A_MT1D_Sensitivity.ipynb
├── Appendix_B_MT1D_tests.ipynb
├── LICENSE
├── MT1D.py
├── MTforward.py
├── MTtutorialV0
│ ├── MTtutorial.pdf
│ ├── MTtutorial.tex
│ ├── references.bib
│ └── seg.bst
├── README.md
├── article.zip
├── article
│ ├── MTtutorial.pdf
│ ├── MTtutorial.tex
│ ├── images
│ │ ├── alphas.png
│ │ ├── alphas_old.png
│ │ ├── beta_knob.png
│ │ ├── justright.png
│ │ ├── justright_old.png
│ │ ├── overfit.png
│ │ ├── overfit_old.png
│ │ ├── sigmat.png
│ │ ├── sigmat_old.png
│ │ ├── underfit.png
│ │ └── underfit_old.png
│ ├── references.bib
│ └── seg.bst
├── images
│ ├── 1DMT_discretize.png
│ └── ForwardProblem.png
├── index.ipynb
├── mesh.ai
└── requirements.txt
├── 1710_Colored_inversion
├── Colored_inversion_notebook.ipynb
├── Figures
│ ├── Figure1.png
│ ├── Figure2.png
│ ├── Figure3.png
│ ├── Figure4.png
│ ├── Figure5.png
│ ├── Figure6.png
│ └── Figure7.png
├── Manuscript-rev1.docx
├── Manuscript-rev1.ipynb
├── Manuscript-rev1.md
├── Manuscript-rev1.pdf
└── data
│ ├── Ai_inline362_horizons.dat
│ ├── All_wells_RawData
│ ├── Checkshot
│ │ ├── F02-1_TD.txt
│ │ ├── F03-2_TD.txt
│ │ ├── F03-4_TD.txt
│ │ ├── F06-1_TD.txt
│ │ └── old
│ │ │ ├── F02-01_DT_TVDSS.txt
│ │ │ ├── F03-02_DT_TVDSS.txt
│ │ │ ├── F03-04_DT_TVDSS.txt
│ │ │ └── F06-01_DT_TVDSS.txt
│ ├── DT_model
│ │ ├── F02-1_TD.txt
│ │ ├── F03-2_TD.txt
│ │ ├── F03-4_TD.txt
│ │ └── F06-1_TD.txt
│ ├── Lasfiles
│ │ ├── F02-1_logs.las
│ │ ├── F03-2_logs.las
│ │ ├── F03-4_logs.las
│ │ └── F06-1_logs.las
│ ├── Tops
│ │ ├── F02-1_markers.txt
│ │ ├── F03-2_markers.txt
│ │ ├── F03-4_markers.txt
│ │ ├── F06-1_markers.txt
│ │ └── F3-well-markers.xls
│ └── Track
│ │ ├── F02-1.track
│ │ ├── F03-2.track
│ │ ├── F03-4.track
│ │ └── F06-1.track
│ └── export_inline362.ascii
├── 1712_FWI_forward_modeling
├── Figures
│ ├── Figure1_composed.pdf
│ ├── Figure1_composed.svg
│ ├── Figure2.pdf
│ ├── Figure2.png
│ ├── Figure3.pdf
│ ├── Figure3.png
│ ├── animation.gif
│ ├── ccode-crop.png
│ ├── setup.png
│ ├── shotrecord_marmou.pdf
│ └── shotrecord_marmou.png
├── Initial
│ ├── FWIpart1.md
│ └── bib_tuto.bib
├── README.md
└── notebooks
│ ├── manuscript.ipynb
│ ├── modelling.html
│ ├── modelling.ipynb
│ └── survey-ship-diagram.png
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 |
3 | # Byte-compiled / optimized / DLL files
4 | __pycache__/
5 | *.py[cod]
6 | *$py.class
7 |
8 | # C extensions
9 | *.so
10 |
11 | # Distribution / packaging
12 | .Python
13 | env/
14 | build/
15 | develop-eggs/
16 | dist/
17 | downloads/
18 | eggs/
19 | .eggs/
20 | lib/
21 | lib64/
22 | parts/
23 | sdist/
24 | var/
25 | *.egg-info/
26 | .installed.cfg
27 | *.egg
28 |
29 | # PyInstaller
30 | # Usually these files are written by a python script from a template
31 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
32 | *.manifest
33 | *.spec
34 |
35 | # Installer logs
36 | pip-log.txt
37 | pip-delete-this-directory.txt
38 |
39 | # Unit test / coverage reports
40 | htmlcov/
41 | .tox/
42 | .coverage
43 | .coverage.*
44 | .cache
45 | nosetests.xml
46 | coverage.xml
47 | *,cover
48 | .hypothesis/
49 |
50 | # Translations
51 | *.mo
52 | *.pot
53 |
54 | # Django stuff:
55 | *.log
56 | local_settings.py
57 |
58 | # Flask stuff:
59 | instance/
60 | .webassets-cache
61 |
62 | # Scrapy stuff:
63 | .scrapy
64 |
65 | # Sphinx documentation
66 | docs/_build/
67 |
68 | # PyBuilder
69 | target/
70 |
71 | # IPython Notebook
72 | .ipynb_checkpoints
73 |
74 | # pyenv
75 | .python-version
76 |
77 | # celery beat schedule file
78 | celerybeat-schedule
79 |
80 | # dotenv
81 | .env
82 |
83 | # virtualenv
84 | venv/
85 | ENV/
86 |
87 | # Spyder project settings
88 | .spyderproject
89 |
90 | # Rope project settings
91 | .ropeproject
92 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/.gitignore:
--------------------------------------------------------------------------------
1 | .ipynb_checkpoints
2 | .env
3 | *~
4 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/README.md:
--------------------------------------------------------------------------------
1 | # Geophysical tutorial: Step-by-step NMO correction
2 |
3 | by [Leonardo Uieda](http://www.leouieda.com)
4 |
5 | *This is a part of The Leading Edge [tutorials
6 | series](https://dx.doi.org/10.1190/tle35020190.1).*
7 |
8 | The manuscript was written in [Authorea](https://www.authorea.com).
9 | You can view and comment on the text at https://www.authorea.com/users/1856/articles/142722/_show_article
10 |
11 | Open any text book about seismic data processing and you will inevitably find a
12 | section about the Normal Moveout (NMO) correction.
13 | When applied to a Common Mid Point (CMP) section, the correction is supposed to
14 | turn the hyperbola associated with a reflection into a straight horizontal
15 | line.
16 | What most text books won't tell you is *how, exactly, do you apply this
17 | equation to the data*?
18 |
19 | That is what this tutorial will teach you (hopefully).
20 |
21 |
22 |
23 | ## Running the code
24 |
25 | The code that accompanies the tutorial is in the `step-by-step-nmo.ipynb`
26 | [Jupyter notebook](http://jupyter.org/).
27 |
28 | You can run it in our own machine by following these steps:
29 |
30 | 1. Make sure you have Python 3.5 with the latest versions of numpy, scipy,
31 | matplotlib, and jupyter installed. The easiest way to do that is by
32 | installing the [Anaconda distribution](https://www.continuum.io/downloads#all).
33 | 2. Download a copy of this repository ([click here to get a zip
34 | file](https://github.com/pinga-lab/nmo-tutorial/archive/master.zip)). Unzip
35 | the repository, preferably in your Desktop folder.
36 | 3. Open a terminal (or `cmd.exe` in Windows) and start the Jupyter notebook
37 | server by running the command `jupyter notebook`.
38 | 4. In the Jupyter web interface, navigate to the repository and click to open
39 | the notebook.
40 | 5. Rejoice!
41 |
42 | 
43 |
44 | ## License
45 |
46 | All text and figures are licensed under a
47 | [CC-BY](http://creativecommons.org/licenses/by/4.0/deed.en_US).
48 | This means that you can use, copy, modify, and redistribute it provided you
49 | give attribution to the original authors.
50 |
51 | All source code is licensed under a [BSD
52 | 3-clause](https://opensource.org/licenses/BSD-3-Clause) license.
53 | This means that you can do whatever you want with the code provided you give
54 | attribution to the original authors and that you cannot blame the authors if
55 | something bad happens as a consequence of the code.
56 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/abstract.tex:
--------------------------------------------------------------------------------
1 | Corresponding author: leouieda@gmail.com
2 |
3 | This is a part of The Leading Edge ``Geophysical Tutorials'' series.
4 | You can read more about it in \citet{Hall_2016a}.
5 |
6 | Open any textbook about seismic data processing and you will inevitably find a
7 | section about the normal moveout (NMO) correction.
8 | There you'll see that we can correct the measured travel-time of a reflected
9 | wave $t$ at a given offset $x$ to obtain the travel-time at normal
10 | incidence $t_0$ by applying the following equation
11 |
12 | \begin{equation}
13 | t_0^2=t^2-\dfrac{x^2}{v_\mathrm{NMO}^2}
14 | \label{eq:traveltime}
15 | \end{equation}
16 |
17 | in which $v_\mathrm{NMO}$ is the NMO velocity.
18 | There are variants of this equation with different degrees of accuracy,
19 | but we'll use this one for simplicity.
20 |
21 | When applied to a common midpoint (CMP) section, the equation above is
22 | supposed to turn the hyperbola associated with a reflection into a straight
23 | horizontal line.
24 | What most textbooks won't tell you is \textit{how, exactly, do you apply this
25 | equation to the data}?
26 |
27 | Read on and I'll explain step-by-step how the algorithm for NMO correction from
28 | \citet{Yilmaz_2001} works and how to implement it in Python.
29 | The accompanying Jupyter notebook \citep{Perez_2007} contains the full source
30 | code, with documentation and tests for each function.
31 | You can download the notebook at
32 | \href{https://github.com/seg}{github.com/seg} or
33 | \href{https://github.com/pinga-lab/nmo-tutorial}{github.com/pinga-lab/nmo-tutorial}.
34 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/bibliography/.placeholder.md:
--------------------------------------------------------------------------------
1 | this is a placeholder for the directory
2 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/bibliography/biblio.bib:
--------------------------------------------------------------------------------
1 | @article{2012,
2 | author = {CMS/CERN},
3 | title = {{A New Boson with a Mass of 125 GeV Observed with the CMS Experiment at the Large Hadron Collider}},
4 | volume = {338},
5 | number = {6114},
6 | pages = {1569-1575},
7 | year = {2012},
8 | doi = {10.1126/science.1230816},
9 | eprint = {http://www.sciencemag.org/content/338/6114/1569.full.pdf},
10 | journal = {Science},
11 | }
12 |
13 |
14 | @article{Holstein_2009,
15 | doi = {10.1088/1742-6596/173/1/012019},
16 | url = {http://dx.doi.org/10.1088/1742-6596/173/1/012019},
17 | year = {2009},
18 | month = {jun},
19 | publisher = {{IOP} Publishing},
20 | volume = {173},
21 | pages = {012019},
22 | author = {Barry R Holstein},
23 | title = {{The mysterious disappearance of Ettore Majorana}},
24 | journal = {J. Phys.: Conf. Ser.},
25 | }
26 |
27 |
28 | @book{Yilmaz_2001,
29 | doi = {10.1190/1.9781560801580},
30 | url = {http://dx.doi.org/10.1190/1.9781560801580},
31 | year = {2001},
32 | month = {jan},
33 | publisher = {Society of Exploration Geophysicists},
34 | author = {Öz Yilmaz},
35 | title = {{Seismic Data Analysis}},
36 | }
37 |
38 |
39 | @article{Perez_2007,
40 | doi = {10.1109/mcse.2007.53},
41 | url = {http://dx.doi.org/10.1109/mcse.2007.53},
42 | year = {2007},
43 | publisher = {Institute of Electrical and Electronics Engineers ({IEEE})},
44 | volume = {9},
45 | number = {3},
46 | pages = {21--29},
47 | author = {Fernando Perez and Brian E. Granger},
48 | title = {{{IPython}: A System for Interactive Scientific Computing}},
49 | journal = {Computing in Science {\&} Engineering},
50 | }
51 |
52 |
53 | @article{Hall_2016,
54 | doi = {10.1190/tle35040367.1},
55 | url = {http://dx.doi.org/10.1190/tle35040367.1},
56 | year = {2016},
57 | month = {apr},
58 | publisher = {Society of Exploration Geophysicists},
59 | volume = {35},
60 | number = {4},
61 | pages = {367--369},
62 | author = {Matt Hall},
63 | title = {{Geophysical Tutorial: The function of interpolation}},
64 | journal = {The Leading Edge},
65 | }
66 |
67 |
68 | @article{Hall_2016a,
69 | doi = {10.1190/tle35020190.1},
70 | url = {http://dx.doi.org/10.1190/tle35020190.1},
71 | year = {2016},
72 | month = {feb},
73 | publisher = {Society of Exploration Geophysicists},
74 | volume = {35},
75 | number = {2},
76 | pages = {190--191},
77 | author = {Matt Hall},
78 | title = {{A user guide to the geophysical tutorials}},
79 | journal = {The Leading Edge},
80 | }
81 |
82 |
83 | @article{van_der_Walt_2011,
84 | doi = {10.1109/mcse.2011.37},
85 | url = {http://dx.doi.org/10.1109/MCSE.2011.37},
86 | year = {2011},
87 | month = {mar},
88 | publisher = {Institute of Electrical and Electronics Engineers ({IEEE})},
89 | volume = {13},
90 | number = {2},
91 | pages = {22--30},
92 | author = {Ste{\'}fan van der Walt and S Chris Colbert and Gaël Varoquaux},
93 | title = {{The {NumPy} Array: A Structure for Efficient Numerical Computation}},
94 | journal = {Computing in Science {\&} Engineering},
95 | }
96 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/data/synthetic_cmp.npz:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1702_Step_by_step_NMO/data/synthetic_cmp.npz
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/environment.yml:
--------------------------------------------------------------------------------
1 | name: nmo-tutorial
2 | dependencies:
3 | - python=3.5
4 | - numpy
5 | - scipy
6 | - matplotlib
7 | - jupyter
8 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/figures/.placeholder.md:
--------------------------------------------------------------------------------
1 | this is a placeholder for the directory
2 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/figures/nmo-application/caption.tex:
--------------------------------------------------------------------------------
1 | Figure 2: (Left) The $v_\mathrm{NMO}$ profile passed to
2 | \texttt{nmo\_correction}.
3 | The profile was interpolated on a line using the two picked velocities (black
4 | squares). (Middle) A synthetic CMP gather. (Right) The output
5 | from our \texttt{nmo\_correction} function.
6 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/figures/nmo-application/config.yml:
--------------------------------------------------------------------------------
1 | version: 1
2 | multicolumn: false
3 | export-width: 0.7\columnwidth
4 | web-width: 500px
5 | align: center
6 | float: h!
7 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/figures/nmo-application/nmo-application.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1702_Step_by_step_NMO/figures/nmo-application/nmo-application.png
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/figures/nmo-application/nmo-application_original.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1702_Step_by_step_NMO/figures/nmo-application/nmo-application_original.png
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/figures/sketch-interpolation/caption.tex:
--------------------------------------------------------------------------------
1 | Figure 1: Sketch of the algorithm for a single trace and $t_0$. To the left
2 | is a trace from the CMP and to the right the corresponding trace from the NMO
3 | corrected gather. The green square in the NMO is the amplitude at $t_0$ that
4 | we want to calculate. We apply the equation to find time $t$ in the CMP, then
5 | interpolate the amplitude using the four samples around $t$ (orange
6 | rectangles). This amplitude is then copied over to the NMO.
7 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/figures/sketch-interpolation/config.yml:
--------------------------------------------------------------------------------
1 | version: 1
2 | multicolumn: false
3 | export-width: 0.7\columnwidth
4 | web-width: 500px
5 | align: center
6 | float: h!
7 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/figures/sketch-interpolation/sketch-interpolation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1702_Step_by_step_NMO/figures/sketch-interpolation/sketch-interpolation.png
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/figures/sketch-interpolation/sketch-interpolation_original.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1702_Step_by_step_NMO/figures/sketch-interpolation/sketch-interpolation_original.png
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/header.tex:
--------------------------------------------------------------------------------
1 | \usepackage{listings}
2 | \usepackage{natbib}
3 | \usepackage{hyperref}
4 |
5 | \lstset{
6 | showstringspaces=true,
7 | backgroundcolor=\color{white}, % choose the background color
8 | % basicstyle=\footnotesize, % size of fonts used for the code
9 | breaklines=true, % automatic line breaking only at whitespace
10 | keywordstyle=\color{black}, % keyword style
11 | stringstyle=\color{black}, % string literal style
12 | language=python, % Set your language (you can change the language for each code-block optionally)
13 | frame=lrtb, %
14 | xleftmargin=\fboxsep, %
15 | xrightmargin=-\fboxsep, %
16 | }
17 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/how-to-nmo.tex:
--------------------------------------------------------------------------------
1 | \section{Doing it backwards}
2 |
3 | It's surprisingly difficult to find a description of a method for calculating
4 | the amplitudes in the NMO correction.
5 | The only one I could find is a single paragraph in the book by
6 | \citet{Yilmaz_2001} (available on the SEG Wiki at
7 | \href{http://wiki.seg.org/wiki/NMO_for_a_flat_reflector}{wiki.seg.org/wiki/NMO\_for\_a\_flat\_reflector}):
8 |
9 | \begin{quotation}
10 | ``The idea is to find the amplitude value at A' on the NMO-corrected gather
11 | from the amplitude value at A on the original CMP gather. Given quantities
12 | $t_0$, $x$, and $v_\mathrm{NMO}$, compute $t$ from equation (1). [...] The
13 | amplitude value at this time can be computed using the amplitudes at the
14 | neighboring integer sample values [...] This is done by an interpolation scheme
15 | that involves the four samples.''
16 | \end{quotation}
17 |
18 | This paragraph is telling us to do the calculation backwards.
19 | Instead of mapping where each point in the CMP goes in the NMO corrected
20 | gather, we should map where each point in the NMO gather comes from in the CMP.
21 | Figure 1 shows a sketch of the procedure to calculate the amplitude of a point
22 | ($t_0$, $x$) in the NMO gather.
23 |
24 | Here is the full algorithm:
25 |
26 | \begin{enumerate}
27 | \item Start with an NMO gather filled with zeros.
28 | \item For each point ($t_0, x$) in the NMO gather, do:
29 | \begin{enumerate}
30 | \item Calculate the reflection travel-time ($t$) given $v_\mathrm{NMO}$ using
31 | the equation in Figure 1.
32 | \item Go to the trace at offset $x$ in the CMP and find the two samples
33 | before and the two samples after time $t$.
34 | \item If $t$ is greater than the recording time or if it doesn't have
35 | two samples after it, skip the next two steps.
36 | \item Use the amplitude in these four samples to interpolate the
37 | amplitude at time $t$.
38 | \item Copy the interpolated amplitude to the NMO gather at ($t_0, x$).
39 | \end{enumerate}
40 | \end{enumerate}
41 |
42 | At the end of this algorithm, we will have a fully populated NMO gather with
43 | the amplitudes sampled from the CMP.
44 | Notice that we didn't actually use the equation for $t_0$.
45 | Instead we calculate the reflection travel-time ($t$).
46 | Good luck guessing that from the equation alone.
47 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/intro.tex:
--------------------------------------------------------------------------------
1 | \section{What the equation doesn't tell us}
2 |
3 | Equation \ref{eq:traveltime} relates travel-times: the one we can measure ($t$)
4 | and the one we want to know ($t_0$).
5 | But the data in our CMP gather are actually a matrix of \textit{amplitudes}
6 | measured as a function of time ($t$) and offset.
7 | Our NMO corrected gather will also be a matrix of amplitudes as a function of
8 | time ($t_0$) and offset.
9 | So what we really have to do transform one matrix of amplitudes into the other.
10 | \textit{But the equation has no amplitudes}!
11 |
12 | This is a major divide between the formula we've all seen before and what
13 | actually goes on in the software that implements it.
14 | You have probably never thought about it -- I certainly hadn't --
15 | so let's bridge this divide.
16 | Next, I'll explain an algorithm that maps the amplitudes in the CMP to
17 | amplitudes in an NMO corrected gather.
18 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/layout.md:
--------------------------------------------------------------------------------
1 | abstract.tex
2 | intro.tex
3 | how-to-nmo.tex
4 | figures/sketch-interpolation/sketch-interpolation.png
5 | the-code-of-nmo.tex
6 | figures/nmo-application/nmo-application.png
7 | thanks.tex
8 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/thanks.tex:
--------------------------------------------------------------------------------
1 | \section{Acknowledgments}
2 |
3 | My sincerest thanks to Evan Bianco, Gregorio Kawakami, Jesper Dramsch, and Matt Hall
4 | for comments and suggestions
5 | and to Öz Yilmaz for generously making the full text of the
6 | ``Seismic Data Analysis'' book available for free and in the open.
7 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/the-code-of-nmo.tex:
--------------------------------------------------------------------------------
1 | \section{The code for NMO}
2 |
3 | Now I'll show how to implement the above algorithm in Python using the NumPy and SciPy libraries \citep{van_der_Walt_2011}.
4 | We'll split the algorithm into three functions.
5 | This is very important when programming any moderately complex code because it allows us to test each part of our code independently.
6 | It also reduces the amount of code we have to search through to find that bug that is messing up our results.
7 | Modular code is easier to understand and to reuse.
8 |
9 | The first function I'll define performs the NMO correction on a given CMP gather.
10 | We'll assume that the CMP gather is a 2D array of amplitudes and that the
11 | velocities are a 1D array with $v_\mathrm{NMO}$ for each time sample.
12 |
13 | \begin{lstlisting}[language=python]
14 | import numpy as np
15 |
16 | def nmo_correction(cmp, dt, offsets, velocities):
17 | nmo = np.zeros_like(cmp)
18 | nsamples = cmp.shape[0]
19 | times = np.arange(0, nsamples*dt, dt)
20 | for i, t0 in enumerate(times):
21 | for j, x in enumerate(offsets):
22 | t = reflection_time(t0, x, velocities[i])
23 | amplitude = sample_trace(cmp[:, j], t, dt)
24 | if amplitude is not None:
25 | nmo[i, j] = amplitude
26 | return nmo
27 | \end{lstlisting}
28 |
29 | This function is essentially the algorithm above translated to Python with some
30 | of the details pushed into the \texttt{reflection\_time} and
31 | \texttt{sample\_trace} functions, which we will define below.
32 |
33 | First, the function that calculates the reflection travel-time:
34 |
35 | \begin{lstlisting}[language=python]
36 | def reflection_time(t0, x, vnmo):
37 | t = np.sqrt(t0**2 + x**2/vnmo**2)
38 | return t
39 | \end{lstlisting}
40 |
41 | For the \texttt{sample\_trace} function, we'll use cubic splines from the
42 | \texttt{scipy.interpolate} package.
43 | For more information on interpolation with scipy, see the tutorial by
44 | \citet{Hall_2016}.
45 |
46 | \begin{lstlisting}[language=python]
47 | from scipy.interpolate import CubicSpline
48 |
49 | def sample_trace(trace, time, dt):
50 | before = int(np.floor(time/dt))
51 | N = trace.size
52 | samples = np.arange(before - 1, before + 3)
53 | if any(samples < 0) or any(samples >= N):
54 | amplitude = None
55 | else:
56 | times = dt*samples
57 | amps = trace[samples]
58 | interpolator = CubicSpline(times, amps)
59 | amplitude = interpolator(time)
60 | return amplitude
61 | \end{lstlisting}
62 |
63 | The Jupyter notebook contains the full code for these functions, including
64 | documentation through Python documentation strings or ``docstrings'' and code
65 | that tests that the functions work as expected.
66 | Also included is an application of our \texttt{nmo\_correction} function to a
67 | synthetic CMP (Figure 2).
68 |
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/title.md:
--------------------------------------------------------------------------------
1 | Step-by-step NMO correction
--------------------------------------------------------------------------------
/1702_Step_by_step_NMO/title.tex:
--------------------------------------------------------------------------------
1 | Step-by-step NMO correction
--------------------------------------------------------------------------------
/1704_Getting_started_with_CSEM/Manuscript.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "**The Leading Edge - Geophysical Tutorial (TLE April 2017)** :: http://dx.doi.org/10.1190/tle36040352.1\n",
8 | "\n",
9 | "# Getting started with controlled-source electromagnetic 1D modeling\n",
10 | "\n",
11 | "Dieter Werthmüller$^1$\n",
12 | "\n",
13 | "Forward modeling is an important part of understanding controlled-source electromagnetic (CSEM) responses. The diffusive term in the electromagnetic wave equation is dominant over the displacement term at these frequencies. It is the diffusive behavior that makes it difficult to imagine the actual propagation of the signal. An important tool in gaining experience therefore is forward modeling, and lots of it. The advantage of one-dimensional (1D) forward modeling, besides its speed, is to study isolated effects (see for instance [Key, 2009](#References)): What is the influence of resistivity anisotropy, or of fine-scale resistivity variations? What is the influence of the airwave? With 1D modeling you can quickly study these effects in isolation before you go on to more complex models in higher dimensions. For an introduction to CSEM for hydrocarbon exploration see, for instance [Constable (2010)](#References).\n",
14 | "\n",
15 | "Luckily the EM community can count on some freely available, stable, high-quality, and open-source CSEM modeling codes. Well-known ones are the codes from the Marine EM Lab at Scripps: `DIPOLE1D` ([Key, 2009](#References)) and `MARE2DEM` ([Key and Ovall, 2011](#References)) for 1D and 2D modeling. `DIPOLE1D` is an isotropic EM modeler for a stratified model using the diffusive approximation valid for low frequencies such as used in CSEM (neglecting displacement currents). `MARE2DEM` is a 2.5D CSEM and magnetotelluric (MT) modeling and inversion code, including resistivity anisotropy. More recently, [Cockett et al. (2015)](#References) published `SimPEG` , and [Hunziker et al. (2015)](#References) `EMmod` . `SimPEG` is a framework for 3D simulation and modeling of all sorts of geophysical methods, among them CSEM. `EMmod` is a 1D electromagnetic modeler including anisotropy in the form of vertical transverse isotropic (VTI) resistivity as well as VTI electric permittivity and VTI magnetic permeability, therefore modeling the whole wavefield for electric and magnetic sources and receivers.\n",
16 | "\n",
17 | "In this tutorial, I use the 1D electromagnetic forward modeling code `empymod`. The code is published under a permissive open-source license and available at [github.com/prisae/empymod](https://github.com/prisae/empymod). It is based on [Hunziker et al. (2015)](#References) for the wavenumber-domain calculation, and on [Key (2012)](#References) for the Hankel and Fourier transforms. The electromagnetic Python modeler `empymod` can model electric or magnetic responses due to a three-dimensional electric or magnetic source in a layered earth model (Figure 1) with $n$ layers, each with electric vertical isotropy ($\\rho_\\text{h}$, $\\lambda$), horizontal and vertical electric permittivity ($\\epsilon_\\text{h}$, $\\epsilon_\\text{v}$), and horizontal and vertical magnetic permeability ($\\mu_\\text{h}$, $\\mu_\\text{v}$), from very low frequencies ($f \\to$ 0 Hz) to very high frequencies ($f \\to$ GHz). The layer parameters all default to 1 if not provided ($\\rho_\\text{h}$ is mandatory).\n",
18 | "\n",
19 | "---\n",
20 | "\n",
21 | "
\n",
22 | "
*Figure 1. A layered earth model. Each horizontal layer is parameterized by horizontal resistivity and anisotropy, horizontal and vertical magnetic permeability, and horizontal and vertical electric permittivity.*\n",
23 | "\n",
24 | "---\n",
25 | "\n",
26 | "Have a look at the accompanying notebook at http://github.com/seg to work through the code yourself and to see more examples and more instructions."
27 | ]
28 | },
29 | {
30 | "cell_type": "markdown",
31 | "metadata": {},
32 | "source": [
33 | "## A first example\n",
34 | "\n",
35 | "We start with a simple model of a half-space below air:\n",
36 | "\n",
37 | "- air/half-space interface at $0\\,$m;\n",
38 | "- electric, $x$-directed source at $x=0\\,$m, $y=0\\,$m, $z=1\\,$m;\n",
39 | "- electric receiver at $x=1000\\,$m, $y=0\\,$m, $z=1\\,$m, with azimuth $=45^\\circ$ and dip $=10^\\circ$; and\n",
40 | "- frequency of $2\\,$Hz.\n",
41 | "\n",
42 | "The function bipole takes up to 24 arguments, but 19 of those have default values. We only have to provide the five mandatory parameters for this simple example: sources, receivers, depths of the interfaces, resistivities, and frequencies:\n",
43 | "\n",
44 | " >>> from empymod import bipole\n",
45 | " >>> inp1 = {'src': [0, 0, 1, 0, 0],\n",
46 | " >>> 'rec': [1000, 0, 1, 45, 10],\n",
47 | " >>> 'depth': 0,\n",
48 | " >>> 'res': [2e14, 100],\n",
49 | " >>> 'freqtime': 2} # Frequency\n",
50 | " >>> bipole(**inp1)\n",
51 | " empymod END; runtime=0:00:00.003869; 3 kernel calls\n",
52 | " array((2.20420888976398e-08 -7.1538671654132e-10j))\n",
53 | "\n",
54 | "From this example, you can infer that an infinitesimally small *dipole* is defined as $[x, y, z,$ azimuth, dip$]$, using a left-handed coordinate system with positive z pointing downward. The azimuth is the anti-clockwise deviation from the x-axis, and the dip is the deviation downward from the xy-plane. A finite length *bipole*, on the other hand, would be defined as $[x_1, x_2, y_1, y_2, z_1, z_2]$, where $[x_1, y_1, z_1]$ is the first pole location, and $[x_2, y_2, z_2]$ is the second pole location. We will see in the next example why the frequency parameter is called `freqtime`.\n",
55 | "\n",
56 | "The default verbosity reveals that `empymod` took some milliseconds to run on my machine, and three kernel calls were required. This is because our receiver has an arbitrary rotation, so it had to calculate the x-, y-, and z-fields due to an x-directed source. And it returns a complex number, the result."
57 | ]
58 | },
59 | {
60 | "cell_type": "markdown",
61 | "metadata": {},
62 | "source": [
63 | "## Frequency and time domain\n",
64 | "\n",
65 | "Let's look at a four-layer isotropic model (air, overburden, target, underburden), with and without hydrocarbons. The resistivities in the two models are:\n",
66 | "\n",
67 | " >>> bri = [2e14, 20, 20, 20]\n",
68 | " >>> oil = [2e14, 20, 500, 20]\n",
69 | "\n",
70 | "We will keep it simple in terms of source and receiver, with an x-directed source and an x-directed inline receiver at the same offset as before. Note that I shift the source and receiver to $z = 0.01\\,$m, because `empymod` places electrodes on a layer interface in the upper layer.\n",
71 | "\n",
72 | "\n",
73 | " >>> inp2 = {'src': [0, 0, 0.01, 0, 0],\n",
74 | " >>> 'rec': [1000, 0, 0.01, 0, 0],\n",
75 | " >>> 'depth': [0, 500, 525]}\n",
76 | "\n",
77 | " >>> f = np.logspace(-1, 3, 100)\n",
78 | " >>> fbres = bipole(res=bri, freqtime=f, **inp2)\n",
79 | " >>> fores = bipole(res=oil, freqtime=f, **inp2)\n",
80 | "\n",
81 | "For the time domain, we have to provide a signal in order to calculate time-domain results instead of frequency-domain results: 0 denotes an impulse response; 1 denotes switch-on; –1 denotes switch-off.\n",
82 | "\n",
83 | " >>> t = np.linspace(0, 0.06, 100)\n",
84 | " >>> tbres = bipole(res=bri, freqtime=t, signal=-1, **inp2)\n",
85 | " >>> tores = bipole(res=oil, freqtime=t, signal=-1, **inp2)\n",
86 | "\n",
87 | "Figure 2 shows the comparison of frequency-domain and time-domain responses for the same model. The jump in the time-domain response is the so-called airwave. Now you see why the frequency-parameter is called `freqtime`: this parameter takes frequencies if `signal=None` (default) or times if `signal` is -1, 0, or 1.\n",
88 | "\n",
89 | "---\n",
90 | "\n",
91 | "\n",
92 | "*Figure 2. A simple land CSEM example. (a) Frequency- and (b) time-domain responses for the four-layer model, with brine (blue) and oil (red) in the third layer. The offset distance is 1 km.*\n",
93 | "\n",
94 | "---"
95 | ]
96 | },
97 | {
98 | "cell_type": "markdown",
99 | "metadata": {},
100 | "source": [
101 | "## Anisotropy\n",
102 | "\n",
103 | "Anisotropic CSEM modeling, more specifically vertical transverse isotropic (VTI) modeling, is the normal case these days (unlike 10 years ago). Resistivity anisotropy $\\lambda$ and mean resistivity ρ m are commonly defined in terms of horizontal ($\\rho_\\text{h}$) and vertical ($\\rho_\\text{v}$) resistivity as:\n",
104 | "\n",
105 | "\n",
106 | "$$\\lambda = \\sqrt{\\frac{\\rho_\\text{v}}{\\rho_\\text{h}}}\\ , \\qquad \\text{and} \\qquad \\rho_\\text{m} = \\sqrt{\\rho_\\text{h}\\rho_\\text{v}} \\ .$$\n",
107 | "\n",
108 | "The three resistivities $\\rho_\\text{h}$, $\\rho_\\text{m}$, and $\\rho_\\text{v}$ are therefore related through $\\lambda$:\n",
109 | "\n",
110 | "$$\\lambda\\rho_\\text{h} = \\rho_\\text{m} = \\frac{1}{\\lambda}\\rho_\\text{v} \\ .$$\n",
111 | "\n",
112 | "A common mistake is to only speak about *increasing anisotropy*, without further specification. As can be seen from the above relationship, *increasing anisotropy* is ambiguous. The relationship between the three resistivities is elaborated in detail in [Werthmüller (2009)](#References). An example of this ambiguity is given in Figure 3; the code to produce it is in the accompanying notebook.\n",
113 | "\n",
114 | "---\n",
115 | "\n",
116 | "\n",
117 | "*Figure 3. The effect of increasing resistivity anisotropy $\\lambda$ on the time-domain response of the model. The offset distance is 2 km.*\n",
118 | "\n",
119 | "---\n",
120 | "\n",
121 | "These results show that stating “increasing anisotropy” can mean quite different things, and it is crucial to specify it more, for instance “increasing anisotropy by keeping the mean resistivity constant.” The isotropic case, the black line, is the same in all three plots. We can draw the following conclusions:\n",
122 | "\n",
123 | "1. The initial step, the airwave, depends only on $\\rho_\\text{h}$.\n",
124 | "2. The DC value, hence time $t\\to\\infty$, depends only on $\\rho_\\text{m}$.\n",
125 | "\n",
126 | "These insights can be used to calculate apparent anisotropy values of the subsurface from early and late time CSEM responses."
127 | ]
128 | },
129 | {
130 | "cell_type": "markdown",
131 | "metadata": {},
132 | "source": [
133 | "## Interactive modeling\n",
134 | "\n",
135 | "Jupyter and the `ipywidgets` make it incredibly easy to create interactive plots, which I use in the notebook to create an interactive model for `empymod`. All there is to do is to load the widgets, define the desired sliders, create a plot function as we have done for the examples before, and subsequently call `interact`. In the example, I include three sliders: one for the resistivity of the target layer, one for the depth of the target layer, and one for the thickness of the target layer. Five additional lines of code are all that is required to generate this interactive modeler: one line to import the required functions, three lines to define the three sliders, and a last line to activate the interaction. The result is shown in Figure 4.\n",
136 | "\n",
137 | "---\n",
138 | "\n",
139 | "\n",
140 | "*Figure 4. (a) A simple earth model and (b) the real and (c) imaginary responses for an x-directed, electric source at 250 m depth and x-directed, electric receivers at the sea bottom. Water depth is 300 m, and the background resistivity is 1$\\,\\Omega\\,$m.*\n",
141 | "\n",
142 | "---\n",
143 | "\n",
144 | "This interactive example should give you a good idea how to write your own interactive modeler. With a few changes, you could instead have a slider for frequencies, anisotropies, source/receiver azimuth and dip, or any other parameter that goes into `bipole`."
145 | ]
146 | },
147 | {
148 | "cell_type": "markdown",
149 | "metadata": {},
150 | "source": [
151 | "## More examples\n",
152 | "\n",
153 | "The notebook contains, besides much more details, the following four additional examples:\n",
154 | "\n",
155 | "1. comparison of bipole versus dipole;\n",
156 | "2. calculate the amplitude and phase of the entire $x,y$-plane;\n",
157 | "3. calculate offset versus frequency crossplot, a common tool for feasibility studies; and\n",
158 | "4. common-source gather of time-domain responses.\n",
159 | "\n",
160 | "The eight complete examples in the notebook should get you up and running with CSEM modeling. I am open to suggestions and pull requests, thankful for bug reports, and happy if I see that you fork it and create something awesome of your own. Happy EM modeling!"
161 | ]
162 | },
163 | {
164 | "cell_type": "markdown",
165 | "metadata": {},
166 | "source": [
167 | "## Acknowledgments\n",
168 | "\n",
169 | "I would like to thank Matt Hall, Jürg Hunziker, Rowan Cockett, and Lindsey Heagy for comments that greatly improved this tutorial.\n",
170 | "\n",
171 | "Corresponding author: dieter@werthmuller.org\n",
172 | "\n",
173 | "$^1$ Geophysical Consultant, Mexico City"
174 | ]
175 | },
176 | {
177 | "cell_type": "markdown",
178 | "metadata": {},
179 | "source": [
180 | "## References\n",
181 | "\n",
182 | "**Cockett, R., S. Kang, L. J. Heagy, A. Pidlisecky, and D. W. Oldenburg, 2015**, SimPEG: An open source framework for simulation and gradient based parameter estimation in geophysical applications: Computers & Geosciences, 85, 142-154. \n",
183 | "DOI: [10.1016/j.cageo.2015.09.015](http://dx.doi.org/10.1016/j.cageo.2015.09.015) \n",
184 | "Software: [simpeg.xyz/](http://simpeg.xyz)\n",
185 | "\n",
186 | "**Constable, S., 2010**, Ten years of marine CSEM for hydrocarbon exploration: Geophysics, 75, 75A67-75A81. \n",
187 | "DOI: [10.1190/1.3483451](http://dx.doi.org/10.1190/1.3483451)\n",
188 | "\n",
189 | "**Hunziker, J., J. Thorbecke, and E. Slob, 2015**, The electromagnetic response in a layered vertical transverse isotropic medium: A new look at an old problem: Geophysics, 80, F1-F18. \n",
190 | "DOI: [10.1190/geo2013-0411.1](http://dx.doi.org/10.1190/geo2013-0411.1) \n",
191 | "Software: [software.seg.org/2015/0001](http://software.seg.org/2015/0001)\n",
192 | " \n",
193 | "**Key, K., 2009**, 1D inversion of multicomponent, multifrequency marine CSEM data: Methodology and synthetic studies for resolving thin resistive layers: Geophysics, 74, F9-F20. \n",
194 | "DOI: [10.1190/1.3058434](http://dx.doi.org/10.1190/1.3058434) \n",
195 | "Software: [marineemlab.ucsd.edu/Projects/Occam/1DCSEM](http://marineemlab.ucsd.edu/Projects/Occam/1DCSEM)\n",
196 | "\n",
197 | "**Key, K., and J. Ovall, 2011**, A parallel goal-oriented adaptive finite element method for 2.5-D electromagnetic modelling: Geophysical Journal International, 186, 137-154. \n",
198 | "DOI: [10.1111/j.1365-246X.2011.05025.x](http://dx.doi.org/10.1111/j.1365-246X.2011.05025.x) \n",
199 | "Software: [mare2dem.ucsd.edu](http://mare2dem.ucsd.edu)\n",
200 | "\n",
201 | "**Key, K., 2012**, Is the fast Hankel transform faster than quadrature?: Geophysics, 77, F21-F30. \n",
202 | "DOI: [10.1190/GEO2011-0237.1](http://dx.doi.org/10.1190/GEO2011-0237.1) \n",
203 | "Software: [software.seg.org/2012/0003](http://software.seg.org/2012/0003)\n",
204 | "\n",
205 | "**Werthmüller, D., 2009**, Inversion of Multi-Transient EM data from anisotropic media: M.Sc. Thesis. \n",
206 | "UUID: [f4b071c1-8e55-4ec5-86c6-a2d54c3eda5a](http://repository.tudelft.nl/view/ir/uuid:f4b071c1-8e55-4ec5-86c6-a2d54c3eda5a)"
207 | ]
208 | },
209 | {
210 | "cell_type": "markdown",
211 | "metadata": {},
212 | "source": [
213 | "\n",
214 | "\n",
215 | "© Dieter Werthmüller. Final article published by the Society of Exploration Geophysicists in **The Leading Edge**, April 2017.\n",
216 | "\n",
217 | "Citation: \n",
218 | "Werthmüller, D., 2017, Getting started with controlled-source electromagnetic 1D modeling: The Leading Edge, 36, 352-355;\n",
219 | "doi: [10.1190/tle36040352.1](http://dx.doi.org/10.1190/tle36040352.1)."
220 | ]
221 | }
222 | ],
223 | "metadata": {
224 | "anaconda-cloud": {},
225 | "kernelspec": {
226 | "display_name": "Python [conda root]",
227 | "language": "python",
228 | "name": "conda-root-py"
229 | },
230 | "language_info": {
231 | "codemirror_mode": {
232 | "name": "ipython",
233 | "version": 3
234 | },
235 | "file_extension": ".py",
236 | "mimetype": "text/x-python",
237 | "name": "python",
238 | "nbconvert_exporter": "python",
239 | "pygments_lexer": "ipython3",
240 | "version": "3.5.2"
241 | }
242 | },
243 | "nbformat": 4,
244 | "nbformat_minor": 1
245 | }
246 |
--------------------------------------------------------------------------------
/1704_Getting_started_with_CSEM/README.rst:
--------------------------------------------------------------------------------
1 | Getting started with controlled-source electromagnetic 1D modeling
2 | ==================================================================
3 |
4 | **The Leading Edge - Geophysical Tutorial (TLE April 2017)**
5 |
6 | Werthmüller, D., 2017, Getting started with controlled-source electromagnetic
7 | 1D modeling: The Leading Edge, 36, 352-355;
8 | doi: `10.1190/tle36040352.1 `_.
9 |
10 | - `Manuscript <./Manuscript.ipynb>`_
11 | - `Accompanying Notebook <./Notebook.ipynb>`_
12 | - `SEG Tutorial Page `_
13 |
--------------------------------------------------------------------------------
/1704_Getting_started_with_CSEM/figures/anisotropy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1704_Getting_started_with_CSEM/figures/anisotropy.png
--------------------------------------------------------------------------------
/1704_Getting_started_with_CSEM/figures/commonsourcegather.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1704_Getting_started_with_CSEM/figures/commonsourcegather.png
--------------------------------------------------------------------------------
/1704_Getting_started_with_CSEM/figures/freqtime.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1704_Getting_started_with_CSEM/figures/freqtime.png
--------------------------------------------------------------------------------
/1704_Getting_started_with_CSEM/figures/interactive_edit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1704_Getting_started_with_CSEM/figures/interactive_edit.png
--------------------------------------------------------------------------------
/1704_Getting_started_with_CSEM/figures/model.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1704_Getting_started_with_CSEM/figures/model.png
--------------------------------------------------------------------------------
/1706_Seismic_rock_physics/manuscript/Figure_1_AADM.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1706_Seismic_rock_physics/manuscript/Figure_1_AADM.pdf
--------------------------------------------------------------------------------
/1706_Seismic_rock_physics/manuscript/Figure_1_AADM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1706_Seismic_rock_physics/manuscript/Figure_1_AADM.png
--------------------------------------------------------------------------------
/1706_Seismic_rock_physics/manuscript/Figure_2_AADM.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1706_Seismic_rock_physics/manuscript/Figure_2_AADM.pdf
--------------------------------------------------------------------------------
/1706_Seismic_rock_physics/manuscript/Figure_2_AADM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1706_Seismic_rock_physics/manuscript/Figure_2_AADM.png
--------------------------------------------------------------------------------
/1706_Seismic_rock_physics/manuscript/Figure_3_AADM.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1706_Seismic_rock_physics/manuscript/Figure_3_AADM.pdf
--------------------------------------------------------------------------------
/1706_Seismic_rock_physics/manuscript/Figure_3_AADM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1706_Seismic_rock_physics/manuscript/Figure_3_AADM.png
--------------------------------------------------------------------------------
/1706_Seismic_rock_physics/manuscript/Figure_4_AADM.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1706_Seismic_rock_physics/manuscript/Figure_4_AADM.pdf
--------------------------------------------------------------------------------
/1706_Seismic_rock_physics/manuscript/Figure_4_AADM.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1706_Seismic_rock_physics/manuscript/Figure_4_AADM.png
--------------------------------------------------------------------------------
/1706_Seismic_rock_physics/manuscript/seismic_rock_physics.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1706_Seismic_rock_physics/manuscript/seismic_rock_physics.docx
--------------------------------------------------------------------------------
/1706_Seismic_rock_physics/manuscript/seismic_rock_physics.md:
--------------------------------------------------------------------------------
1 | # Seismic rock physics
2 |
3 | ### Alessandro Amato del Monte, Eni Norge AS, Stavanger, Norway
4 |
5 | _Corresponding author: alessandro.amato.del.monte@eni.com_
6 |
7 | Rock physics studies the relationship between physical and elastic properties of rocks and is the basis of quantitative seismic interpretation. It has arguably given exploration geophysicists a solid quantitative basis to their interpretation of seismic data. It can be tackled at different scales of investigation by people with various backgrounds — from geophysicists to civil engineers, from mathematicians to petrophysicists.
8 |
9 | In this tutorial, and the Python code in the accompanying Jupyter Notebook (https://github.com/seg/tutorials), I offer a practical introduction to rock physics, showing how to code simple models and apply them to analyse well log data and predict their seismic responses. Here's the workflow:
10 |
11 | 1. Data exploration — inspecting what we have.
12 | 2. Rock physics modeling — two simple models.
13 | 3. Rock physics templates — modeling more parameters.
14 | 4. Seismic response modeling — predicting seismic.
15 |
16 | The well data used in this tutorial is one of the datasets available on the _Quantitative Seismic Interpretation_ book website (Avseth et al., 2005).
17 |
18 |
19 | ## Data exploration
20 |
21 | We get our bearings by plotting the logs together. Figure 1a shows VSH (shale volume) log in the first track, $I_\mathrm{P}$ (P-wave impedance) in the second track, and $V_\mathrm{P} / V_\mathrm{S}$ (the ratio of P-wave to S-wave velocities) in the third. I highlight sands in yellow and shales in red. Next to these three tracks are crossplots of $V_\mathrm{P}$ against effective porosity $\phi_\mathrm{e}$ (Fig. 1b), and of $V_\mathrm{P} / V_\mathrm{S}$ against $I_\mathrm{P}$ (Fig. 1c).
22 |
23 | In the $V_\mathrm{P}$–$\phi_\mathrm{e}$ crossplot I have decided to avoid plotting shales since effective porosity is zero for pure shales so this plot will not help in the analysis of non-reservoir rocks.
24 |
25 | 
26 |
27 | **Figure 1.** (a) Shale volume (VSH), P-wave impedance ($I_\mathrm{P}$ in 103 kg s–1 m–2), and $V_\mathrm{P} / V_\mathrm{S}$ for the interval 2100 m to 2250 m. (b) P-wave velocity ($V_\mathrm{P}$ in m/s) vs effective porosity ($\phi_\mathrm{e}$). (c) $V_\mathrm{P} / V_\mathrm{S}$ vs $I_\mathrm{P}$.
28 |
29 |
30 |
31 | ## Rock physics modeling
32 |
33 | Rock physics models output dry-rock frame moduli: bulk modulus $K_\mathrm{d}$ and shear modulus $\mu_\mathrm{d}$. These moduli represent the resistance of the rock's dry frame to normal and tangential stress respectively. They are used together with Gassmann's equation to calculate the saturated rock moduli ($K$ and $\mu$) which are, together with density, the building blocks for P-wave and S-wave velocities, $V_\mathrm{P}$ and $V_\mathrm{S}$:
34 |
35 | $$V_\mathrm{P} = \sqrt{\frac{K + 4\mu / 3}{\rho}} \ \ \ \ V_\mathrm{S} = \sqrt{\frac{\mu}{\rho}}$$
36 |
37 | The product of velocity and density is called acoustic impedance. Impedance contrasts are ultimately what generate seismic reflections; this is why rock physics, by linking rock and fluid properties to velocities, allows us to understand and explain seismic reflections.
38 |
39 | In many cases, we know the velocity and density of a non-reservoir sandstone, and would like to know how these quantities will change if the porosity were only higher, the net:gross (N:G) more favourable, or the fluid more valuable. We need a model!
40 |
41 | In the notebook, I introduce two simple but useful models, the Soft Sand model and the Stiff Sand model. The notebook provides the theory and the code to help you understand these models. Here I only show what they produce.
42 |
43 | We'd like to know how well our data fit the models we make. The easiest way is to look at them both in one plot. Figure 2a shows the same interval as before — the reservoir sand from 2100 m to 2250 m — with the Soft Sand model and the Stiff Sand model superimposed. At first sight, both models may offer a good starting point to investigate these sands.
44 |
45 | 
46 |
47 | **Figure 2.** $V_\mathrm{P}$ vs $\phi_\mathrm{e}$ for the reservoir interval shown in Figure 1. (a) The Soft Sand model is shown as a black line; the Stiff Sand model is a discontinuous line. (b) The Soft Sand model and (c) the Stiff Sand model with varying N:G.
48 |
49 | The sands are not hydrocarbon-bearing so I can dismiss fluid effects and start leveraging the rock physics model by displaying how mineralogy affects the velocities. To do that, I will simplify the problem assuming variations in N:G. When N:G is 1, then the mineral moduli will be equal to those of quartz, when it is lower than 1 than I will use composite mineral moduli given by the Voigt–Reuss–Hill average of quartz and a generic shale. So to compute the bulk modulus given the constituent volume fractions _f_:
50 |
51 | $$K_\mathrm{Voigt} = (f_\mathrm{qz} \cdot K_\mathrm{qz}) + (f_\mathrm{sh} \cdot K_\mathrm{sh})$$
52 |
53 | $$K_\mathrm{Reuss} = \frac{1} { (f_\mathrm{qz} / K_\mathrm{qz}) + (f_\mathrm{sh} / K_\mathrm{sh}) }$$
54 |
55 | $$K_\mathrm{Hill} = \frac{K_\mathrm{Voigt} + K_\mathrm{Reuss}}{2}$$
56 |
57 | Now let's put it all together and show how the models change for different mineralogies. There's just one catch: to have the models spread out to cover the entire range of the well data, I had to code them with different parameters. In the notebook, these are the lines that call the two models:
58 |
59 | Kdry, MUdry = softsand(K0, MU0, phi, phic=0.5, Cn=12, P=45)
60 | Kdry, MUdry = stiffsand(K0, MU0, phi, phic=0.4, Cn=8, P=45)
61 |
62 | The Soft Sand model uses higher critical porosity and coordination number than the Stiff Sand model, which means that the reservoir sands can be described by either a stiffer 'soft' sand or a softer 'stiff' sand (the coordination number `Cn` suggests a closer packing of the individual grains that make up our sand, which in turn means a more compact and harder material).
63 |
64 | Figures 2b and 2c show the result of plotting the data against the two models. So far, both models fit the datapoints. It is up to the interpreter to decide which model is more appropriate. Adding the effect of hydrocarbons, and changing other parameters — especially porosity — might help us figure it out.
65 |
66 |
67 | ## Rock physics templates
68 |
69 | The set of models for varying degrees of N:G shown above are a basic example of rock physics templates (RPTs), as promoted by Avseth et al. (2005). From that starting point, it is fairly easy to build a function to create RPTs which show not only variations in porosity and mineralogy but also fluid content.
70 |
71 | In the notebook, I show how to combine the functions to compute $K_\mathrm{dry}$ and $\mu_\mathrm{dry}$ for the Soft Sand and Stiff Sand models with the velocities given by Gassmann's equation, to produce arrays of P-wave impedance $I_\mathrm{P}$ and $V_\mathrm{P}/V_\mathrm{S}$ that we can study individually — as in Figure 3a — or overlay on top of well data as an aid to interpretation — as in Figures 3b and 3c.
72 |
73 | 
74 |
75 | **Figure 3.** Rock physics templates for the Soft Sand model. (a) The template by itself, showing how we expect $V_\mathrm{P}/V_\mathrm{S}$ and $I_\mathrm{P}$ to vary with water saturation ($S_\mathrm{w}$) and porosity ($\phi_\mathrm{e}$). (b) The template (gray) plotted with the data (green). (c) The template (blue) has been recalculated by changing the rock matrix moduli, assuming higher proportion of quartz (i.e., cleaner sands).
76 |
77 | We can go further, for example one can check the validity of the elastic moduli assigned to the second mineral (the one I have referred to as 'shale') by varying them and displaying different RPTs. In Figure 3c I have changed the bulk and shear modulus values to get a better fit against the data. In the absence of other information, this is perfectly reasonable — and valuable — knowledge to add to the exploration puzzle.
78 |
79 |
80 | ## Seismic response modeling
81 |
82 | Once I have a good grasp of the RPM and the way it reacts to different input parameters, I can start using it to explore seismic data too. It is very easy to use the velocities and densities output by our rock physics model to build simple two-layer models and analyse seismic and AVO signatures of the modeled top reservoir. One example is shown in Figure 4; the idea is fully developed in the accompanying Jupyter Notebook.
83 |
84 | 
85 |
86 | **Figure 4.** The expected seismic response of a gas-saturated sand with 15% porosity. From left to right: P-wave impedance $I_\mathrm{P}$, $V_\mathrm{P}/V_\mathrm{S}$, the response at 0 degrees and 30 degrees of offset, and the amplitude-vs-angle curve.
87 |
88 |
89 | ## Conclusions
90 |
91 | I have shown here how I implement rock physics models and templates using standard Python libraries. The functions introduced here can be extended fairly easily for additional rock physics models, some of which are shown in the accompanying notebook (https://github.com/seg/tutorials). The workflow can be used to study real datasets, analyse the elastic behaviour of individual reservoirs, and build a collection of seismic and AVO signatures to be associated to particular combinations of caprocks and reservoirs.
92 |
93 |
94 | ## References
95 |
96 | Avseth, P., Mukerji, T. & Mavko, G. (2005). _Quantitative Seismic Interpretation._ Cambridge University Press. Data repository: http://ageo.co/QSIdata
97 |
--------------------------------------------------------------------------------
/1706_Seismic_rock_physics/manuscript/seismic_rock_physics.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1706_Seismic_rock_physics/manuscript/seismic_rock_physics.pdf
--------------------------------------------------------------------------------
/1706_Seismic_rock_physics/manuscript/seismic_rock_physics_figures.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import matplotlib.pyplot as plt
3 | import pandas as pd
4 |
5 |
6 | def vrh(f, M1, M2):
7 | '''
8 | Simple Voigt-Reuss-Hill bounds for 2-components mixture, (C) aadm 2017
9 |
10 | INPUT
11 | f: volumetric fraction of mineral 1
12 | M1: elastic modulus mineral 1
13 | M2: elastic modulus mineral 2
14 |
15 | OUTPUT
16 | M_Voigt: upper bound or Voigt average
17 | M_Reuss: lower bound or Reuss average
18 | M_VRH: Voigt-Reuss-Hill average
19 | '''
20 | M_Voigt = f*M1 + (1-f)*M2
21 | M_Reuss = 1 / (f/M1 + (1-f)/M2)
22 | M_VRH = (M_Voigt+M_Reuss)/2
23 | return M_Voigt, M_Reuss, M_VRH
24 |
25 |
26 | def vels(K_DRY, G_DRY, K0, D0, Kf, Df, phi):
27 | '''
28 | Calculates velocities and densities of saturated rock via Gassmann
29 | equation, (C) aadm 2015
30 |
31 | INPUT
32 | K_DRY, G_DRY: dry rock bulk & shear modulus in GPa
33 | K0, D0: mineral bulk modulus and density in GPa
34 | Kf, Df: fluid bulk modulus and density in GPa
35 | phi: porosity
36 | '''
37 | rho = D0*(1-phi)+Df*phi
38 | K = K_DRY + (1-K_DRY/K0)**2 / ((phi/Kf) + ((1-phi)/K0) - (K_DRY/K0**2))
39 | vp = np.sqrt((K+4./3*G_DRY)/rho)*1e3
40 | vs = np.sqrt(G_DRY/rho)*1e3
41 | return vp, vs, rho, K
42 |
43 |
44 | def hertzmindlin(K0, G0, phi, phic=0.4, Cn=8.6, P=10, f=1):
45 | '''
46 | Hertz-Mindlin model
47 | written by aadm (2015) from Rock Physics Handbook, p.246
48 |
49 | INPUT
50 | K0, G0: mineral bulk & shear modulus in GPa
51 | phi: porosity
52 | phic: critical porosity (default 0.4)
53 | Cn: coordination nnumber (default 8.6)
54 | P: confining pressure in MPa (default 10)
55 | f: shear modulus correction factor
56 | 1 = dry pack with perfect adhesion
57 | 0 = dry frictionless pack
58 | '''
59 | P /= 1e3 # converts pressure in same units as solid moduli (GPa)
60 | PR0 = (3*K0-2*G0)/(6*K0+2*G0) # poisson's ratio of mineral mixture
61 | K_HM = (P*(Cn**2*(1-phic)**2*G0**2) / (18*np.pi**2*(1-PR0)**2))**(1/3)
62 | G_HM = ((2+3*f-PR0*(1+3*f))/(5*(2-PR0))) * ((P*(3*Cn**2*(1-phic)**2*G0**2)/(2*np.pi**2*(1-PR0)**2)))**(1/3)
63 | return K_HM, G_HM
64 |
65 |
66 | def softsand(K0, G0, phi, phic=0.4, Cn=8.6, P=10, f=1):
67 | '''
68 | Soft-sand (uncemented) model
69 | written by aadm (2015) from Rock Physics Handbook, p.258
70 |
71 | INPUT
72 | K0, G0: mineral bulk & shear modulus in GPa
73 | phi: porosity
74 | phic: critical porosity (default 0.4)
75 | Cn: coordination nnumber (default 8.6)
76 | P: confining pressure in MPa (default 10)
77 | f: shear modulus correction factor
78 | 1 = dry pack with perfect adhesion
79 | 0 = dry frictionless pack
80 | '''
81 | K_HM, G_HM = hertzmindlin(K0, G0, phi, phic, Cn, P, f)
82 | K_DRY = -4/3*G_HM + (((phi/phic)/(K_HM+4/3*G_HM)) + ((1-phi/phic)/(K0+4/3*G_HM)))**-1
83 | tmp = G_HM/6*((9*K_HM+8*G_HM) / (K_HM+2*G_HM))
84 | G_DRY = -tmp + ((phi/phic)/(G_HM+tmp) + ((1-phi/phic)/(G0+tmp)))**-1
85 | return K_DRY, G_DRY
86 |
87 |
88 | def stiffsand(K0, G0, phi, phic=0.4, Cn=8.6, P=10, f=1):
89 | '''
90 | Stiff-sand model
91 | written by aadm (2015) from Rock Physics Handbook, p.260
92 |
93 | INPUT
94 | K0, G0: mineral bulk & shear modulus in GPa
95 | phi: porosity
96 | phic: critical porosity (default 0.4)
97 | Cn: coordination nnumber (default 8.6)
98 | P: confining pressure in MPa (default 10)
99 | f: shear modulus correction factor
100 | 1 = dry pack with perfect adhesion
101 | 0 = dry frictionless pack
102 | '''
103 | K_HM, G_HM = hertzmindlin(K0, G0, phi, phic, Cn, P, f)
104 | K_DRY = -4/3*G0 + (((phi/phic)/(K_HM+4/3*G0)) + ((1-phi/phic)/(K0+4/3*G0)))**-1
105 | tmp = G0/6*((9*K0+8*G0) / (K0+2*G0))
106 | G_DRY = -tmp + ((phi/phic)/(G_HM+tmp) + ((1-phi/phic)/(G0+tmp)))**-1
107 | return K_DRY, G_DRY
108 |
109 |
110 | def rpt(model='soft', vsh=0.0, fluid='gas', phic=0.4, Cn=8, P=10, f=1, display=True):
111 | phi = np.linspace(0.01, phic, 10)
112 | sw = np.linspace(0, 1, 10)
113 | xx = np.empty((phi.size, sw.size))
114 | yy = np.empty((phi.size, sw.size))
115 | (K_hc, RHO_hc) = (K_g, RHO_g) if fluid == 'gas' else (K_o, RHO_o)
116 | _, _, K0 = vrh(vsh, K_sh, K_qz)
117 | _, _, MU0 = vrh(vsh, MU_sh, MU_qz)
118 | RHO0 = vsh*RHO_sh+(1-vsh)*RHO_qz
119 | if model == 'soft':
120 | Kdry, MUdry = softsand(K0, MU0, phi, phic, Cn, P, f)
121 | elif model == 'stiff':
122 | Kdry, MUdry = stiffsand(K0, MU0, phi, phic, Cn, P, f)
123 | for i, val in enumerate(sw):
124 | _, K_f, _ = vrh(val, K_b, K_hc)
125 | RHO_f = val*RHO_b + (1-val)*RHO_hc
126 | vp, vs, rho, _ = vels(Kdry, MUdry, K0, RHO0, K_f, RHO_f, phi)
127 | xx[:, i] = vp*rho
128 | yy[:, i] = vp/vs
129 | opt1 = {'backgroundcolor': '0.9'}
130 | opt2 = {'ha': 'right', 'backgroundcolor': '0.9'}
131 | if display:
132 | plt.figure(figsize=(7, 7))
133 | plt.plot(xx, yy, '-ok', alpha=0.3)
134 | plt.plot(xx.T, yy.T, '-ok', alpha=0.3)
135 | for i, val in enumerate(phi):
136 | plt.text(xx[i, -1], yy[i, -1]+.01, '$\phi = {:.02f}$'.format(val), **opt1)
137 | plt.text(xx[-1, 0]-100, yy[-1, 0], '$S_w = {:.02f}$'.format(sw[0]), **opt2)
138 | plt.text(xx[-1, -1]-100, yy[-1, -1], '$S_w = {:.02f}$'.format(sw[-1]), **opt2)
139 | plt.xlabel('Ip'), plt.ylabel('Vp/Vs')
140 | plt.title('RPT {} (N:G = {}, fluid = {})'.format(model.upper(), 1-vsh, fluid))
141 | return xx, yy
142 |
143 |
144 | # define basic styles for plotting log curves (sty0), sand (sty1) and shale (sty2)
145 | sty0 = {'lw': 1, 'color': 'k', 'ls': '-'}
146 | sty1 = {'marker': 'o', 'color': 'g',
147 | 'ls': 'none', 'ms': 6, 'mec': 'none', 'alpha': 0.5}
148 | sty2 = {'marker': 'o', 'color': 'r',
149 | 'ls': 'none', 'ms': 6, 'mec': 'none', 'alpha': 0.5}
150 |
151 | # define labels for subplots
152 | subplotlabels = ['(A)', '(B)', '(C)']
153 |
154 | # load well data, setup some initial parameters
155 | L = pd.read_csv('../qsiwell5.csv', index_col=0)
156 | z1, z2 = 2100, 2250
157 | cutoff_sand = 0.3
158 | cutoff_shale = 0.5
159 |
160 | # define filters to select sand (ss) and shale (sh)
161 | ss = (L.index >= z1) & (L.index <= z2) & (L.VSH <= cutoff_sand)
162 | sh = (L.index >= z1) & (L.index <= z2) & (L.VSH >= cutoff_shale)
163 |
164 |
165 | # ----------------------------------
166 | # --> FIGURE 1
167 | # ----------------------------------
168 |
169 | f = plt.subplots(figsize=(12, 5))
170 | ax0 = plt.subplot2grid((1, 9), (0, 0), colspan=1) # shale volume curve
171 | ax1 = plt.subplot2grid((1, 9), (0, 1), colspan=1) # ip curve
172 | ax2 = plt.subplot2grid((1, 9), (0, 2), colspan=1) # vp/vs curve
173 | ax3 = plt.subplot2grid((1, 9), (0, 3), colspan=3) # crossplot phi - vp
174 | ax4 = plt.subplot2grid((1, 9), (0, 6), colspan=3) # crossplot ip - vp/vs
175 |
176 | ax0.plot(L.VSH[ss], L.index[ss], **sty1)
177 | ax0.plot(L.VSH[sh], L.index[sh], **sty2)
178 | ax0.plot(L.VSH, L.index, **sty0)
179 | ax0.locator_params(axis='x', nbins=2)
180 | ax0.set_ylabel('Depth')
181 | ax0.set_xlabel('VSH')
182 | ax1.plot(L.IP[ss], L.index[ss], **sty1)
183 | ax1.plot(L.IP[sh], L.index[sh], **sty2)
184 | ax1.plot(L.IP, L.index, **sty0)
185 | ax1.locator_params(axis='x', nbins=2)
186 | ax1.set_xlabel('$I_\mathrm{P}$')
187 | ax1.set_xlim(4e3, 8e3)
188 | ax2.plot(L.VPVS[ss], L.index[ss], **sty1)
189 | ax2.plot(L.VPVS[sh], L.index[sh], **sty2)
190 | ax2.plot(L.VPVS, L.index, **sty0)
191 | ax2.locator_params(axis='x', nbins=2)
192 | ax2.set_xlabel('$V_\mathrm{P} / V_\mathrm{S}$')
193 | ax2.set_xlim(1.5, 3)
194 | ax3.plot(L.PHIE[ss], L.VP[ss], **sty1)
195 | ax3.set_xlim(0, 0.4), ax3.set_ylim(2e3, 4e3)
196 | ax3.set_xlabel('$\phi_\mathrm{e}$ ')
197 | ax3.set_ylabel('$V_\mathrm{P}$')
198 | ax4.plot(L.VP*L.RHO[ss], L.VP/L.VS[ss], **sty1)
199 | ax4.plot(L.VP*L.RHO[sh], L.VP/L.VS[sh], **sty2)
200 | ax4.set_xlim(4e3, 8e3), ax4.set_ylim(1.5, 3)
201 | ax4.set_xlabel('$I_\mathrm{P}$')
202 | ax4.set_ylabel('$V_\mathrm{P} / V_\mathrm{S}$')
203 | for aa in [ax0, ax1, ax2]:
204 | aa.set_ylim(z2, z1)
205 | for aa in [ax0, ax1, ax2, ax3, ax4]:
206 | aa.tick_params(which='major', labelsize=8)
207 | for aa in [ax1, ax2]:
208 | aa.set_yticklabels([])
209 | # to place the labels on the outside comment following 3 lines
210 | # and increase subplots_adjust wspace to 1
211 | for aa in [ax3, ax4]:
212 | aa.yaxis.set_label_coords(0.08, 0.5)
213 | aa.xaxis.set_label_coords(0.5, 0.06)
214 | # ax0.text(0, 1.05, '(A)', fontsize=16, weight='bold', transform=ax0.transAxes)
215 | # ax3.text(0, 1.05, '(B)', fontsize=16, weight='bold', transform=ax3.transAxes)
216 | # ax4.text(0, 1.05, '(C)', fontsize=16, weight='bold', transform=ax4.transAxes)
217 | plt.subplots_adjust(wspace=.5, left=0.05, right=0.95, top=.85)
218 |
219 | plt.savefig('Figure_1_AADM.png', dpi=300, bbox_inches='tight')
220 | plt.savefig('Figure_1_AADM.pdf', dpi=300, bbox_inches='tight')
221 |
222 | # ----------------------------------
223 | # --> FIGURE 2
224 | # ----------------------------------
225 |
226 | RHO_qz, K_qz = 2.6, 37
227 | MU_qz, RHO_sh = 44, 2.8
228 | K_sh, MU_sh = 15, 5
229 | RHO_b, K_b = 1.1, 2.8
230 | RHO_o, RHO_g = 0.8, 0.2
231 | K_o, K_g = 0.9, 0.06
232 |
233 | Cn = 8
234 | phic = 0.4
235 |
236 | phi = np.linspace(0.01, 0.4)
237 | K0, MU0, RHO0 = K_qz, MU_qz, RHO_qz
238 |
239 | Kdry, MUdry = softsand(K0, MU0, phi, phic, Cn, P=45)
240 | vp_ssm0, vs_ssm0, rho_ssm0, _ = vels(Kdry, MUdry, K0, RHO0, K_b, RHO_b, phi)
241 |
242 | Kdry, MUdry = stiffsand(K0, MU0, phi, phic, Cn, P=45)
243 | vp_sti0, vs_sti0, rho_sti0, _ = vels(Kdry, MUdry, K0, RHO0, K_b, RHO_b, phi)
244 |
245 | NG = np.linspace(0.6, 1.0, 5)
246 |
247 | f, ax = plt.subplots(nrows=1, ncols=3, figsize=(12, 5))
248 | ax[0].plot(phi, vp_ssm0, '-k')
249 | ax[0].plot(phi, vp_sti0, ':k')
250 | ax[0].text(0.15, 3500, 'Soft Sand', fontsize=14, ha='right', style='italic')
251 | ax[0].text(0.28, 3750, 'Stiff Sand', fontsize=14, ha='left', style='italic')
252 | for i in NG:
253 | _, _, K0 = vrh(i, K_qz, K_sh)
254 | _, _, MU0 = vrh(i, MU_qz, MU_sh)
255 | RHO0 = i*RHO_qz+(1-i)*RHO_sh
256 | Kdry, MUdry = softsand(K0, MU0, phi, phic=.5, Cn=12, P=45)
257 | vp_ssm, vs_ssm, rho_ssm, _ = vels(Kdry, MUdry, K0, RHO0, K_b, RHO_b, phi)
258 | Kdry, MUdry = stiffsand(K0, MU0, phi, phic=.4, Cn=8, P=45)
259 | vp_sti, vs_sti, rho_sti, _ = vels(Kdry, MUdry, K0, RHO0, K_b, RHO_b, phi)
260 | ax[1].plot(phi, vp_ssm, '-k', label='N:G = {:.2f}'.format(i), alpha=i-.4)
261 | ax[2].plot(phi, vp_sti, '-k', label='N:G = {:.2f}'.format(i), alpha=i-.4)
262 | for i, aa in enumerate(ax):
263 | if i is not 0:
264 | aa.legend(fontsize=8, loc=3)
265 | aa.plot(L.PHIE[ss], L.VP[ss], **sty1, label='')
266 | aa.set_xlim(0, 0.4), aa.set_ylim(2e3, 4e3)
267 | aa.set_xlabel('$\phi_\mathrm{e}$ ')
268 | aa.set_ylabel('$V_\mathrm{P}$')
269 | aa.yaxis.set_label_coords(0.08, 0.5)
270 | aa.xaxis.set_label_coords(0.5, 0.06)
271 | aa.tick_params(which='major', labelsize=8)
272 | # aa.text(0, 1.05, subplotlabels[i], fontsize=16, weight='bold', transform=aa.transAxes)
273 | ax[0].set_title('Soft and Stiff Sand models')
274 | ax[1].set_title('Soft Sand model')
275 | ax[2].set_title('Stiff Sand model')
276 | plt.subplots_adjust(wspace=.15, left=0.05, right=0.95, top=.85)
277 |
278 | plt.savefig('Figure_2_AADM.png', dpi=300, bbox_inches='tight')
279 | plt.savefig('Figure_2_AADM.pdf', dpi=300, bbox_inches='tight')
280 |
281 | # ----------------------------------
282 | # --> FIGURE 3
283 | # ----------------------------------
284 |
285 | phic = 0.5
286 | ip_rpt0, vpvs_rpt0 = rpt(model='soft', vsh=0.6, fluid='oil', phic=phic, Cn=12, P=45, f=.3, display=False)
287 | ip_rpt1, vpvs_rpt1 = rpt(model='soft', vsh=0.8, fluid='oil', phic=phic, Cn=12, P=45, f=.3, display=False)
288 | phi = np.linspace(0.01, phic, 10)
289 | sw = np.linspace(0, 1, 10)
290 |
291 | opt1 = {'fontsize': 8, 'ha': 'left', 'va': 'bottom', 'weight': 'bold', 'backgroundcolor': '.9'}
292 | opt2 = {'fontsize': 8, 'ha': 'right', 'va': 'bottom', 'weight': 'bold', 'rotation': 'vertical'}
293 |
294 | f, ax = plt.subplots(nrows=1, ncols=3, figsize=(12, 5))
295 | # ax[0].plot(ip_rpt0, vpvs_rpt0, 'sk', mew=0, alpha=0.5)
296 | ax[1].plot(ip_rpt0, vpvs_rpt0, '-sk', mew=0, alpha=0.3, ms=5)
297 | ax[1].plot(ip_rpt0.T, vpvs_rpt0.T, '-k', alpha=0.3)
298 | ax[2].plot(ip_rpt1, vpvs_rpt1, '-sb', mew=0, alpha=0.3, ms=5)
299 | ax[2].plot(ip_rpt1.T, vpvs_rpt1.T, '-b', alpha=0.3)
300 | xx = ip_rpt0
301 | yy = vpvs_rpt0
302 | ax[0].plot(xx, yy, '-sk', alpha=0.3, mew=0, ms=5)
303 | ax[0].plot(xx.T, yy.T, '-k', alpha=0.3)
304 | for i, val in enumerate(phi):
305 | ax[0].text(xx[i, -1], yy[i, -1], '$\phi = {:.02f}$'.format(val), **opt1)
306 | ax[0].text(xx[-1, 0]-100, yy[-1, 0], '$S_w = {:.02f}$'.format(sw[0]), **opt2)
307 | ax[0].text(xx[-1, -1]-100, yy[-1, -1], '$S_w = {:.02f}$'.format(sw[-1]), **opt2)
308 | for i, aa in enumerate(ax):
309 | if i is not 0:
310 | aa.plot(L.VP[ss]*L.RHO[ss], L.VP[ss]/L.VS[ss], **sty1)
311 | aa.set_xlim(1e3, 12e3), aa.set_ylim(1.6, 2.8)
312 | aa.set_xlabel('$I_\mathrm{P}$')
313 | aa.set_ylabel('$V_\mathrm{P} / V_\mathrm{S}$')
314 | aa.yaxis.set_label_coords(0.08, 0.5)
315 | aa.xaxis.set_label_coords(0.5, 0.06)
316 | aa.tick_params(which='major', labelsize=8)
317 | # aa.text(0, 1.05, subplotlabels[i], fontsize=16, weight='bold', transform=aa.transAxes)
318 | plt.subplots_adjust(wspace=.15, left=0.05, right=0.95, top=.85)
319 | plt.savefig('Figure_3_AADM.png', dpi=300, bbox_inches='tight')
320 | plt.savefig('Figure_3_AADM.pdf', dpi=300, bbox_inches='tight')
321 |
322 |
323 | # ----------------------------------
324 | # --> FIGURE 4
325 | # ----------------------------------
326 |
327 | from bruges.reflection import shuey2
328 | from bruges.filters import ricker
329 |
330 | # the properties of the upper layer are an average from
331 | # the shale points in the well
332 | vp0, vs0, rho0 = L[['VP', 'VS', 'RHO']][sh].mean().values
333 |
334 | # the properties of the lower layer come from RPM
335 | phi, vsh = .15, .8
336 | _, _, K0 = vrh(vsh, K_qz, K_sh)
337 | _, _, MU0 = vrh(vsh, MU_qz, MU_sh)
338 | RHO0 = vsh*RHO_qz+(1-vsh)*RHO_sh
339 | Kdry, MUdry = softsand(K0, MU0, phi, phic=.5, Cn=12, P=45, f=.3)
340 | vp1, vs1, rho1, _ = vels(Kdry, MUdry, K0, RHO0, K_g, RHO_g, phi)
341 |
342 | n_samples = 500
343 | interface = int(n_samples/2)
344 | ang = np.arange(31)
345 | wavelet = ricker(.25, 0.001, 25)
346 |
347 | model_ip, model_vpvs, rc0, rc1 = (np.zeros(n_samples) for _ in range(4))
348 | model_z = np.arange(n_samples)
349 | model_ip[:interface] = vp0*rho0
350 | model_ip[interface:] = vp1*rho1
351 | model_vpvs[:interface] = np.true_divide(vp0, vs0)
352 | model_vpvs[interface:] = np.true_divide(vp1, vs1)
353 |
354 | avo = shuey2(vp0, vs0, rho0, vp1, vs1, rho1, ang)
355 | rc0[interface] = avo[0]
356 | rc1[interface] = avo[-1]
357 | synt0 = np.convolve(rc0, wavelet, mode='same')
358 | synt1 = np.convolve(rc1, wavelet, mode='same')
359 | clip = np.max(np.abs([synt0, synt1]))
360 | clip += clip*.2
361 |
362 | opt3 = {'color': 'k', 'linewidth': 4}
363 | opt4 = {'linewidth': 0, 'alpha': 0.5}
364 |
365 | f = plt.subplots(figsize=(10, 4))
366 | ax0 = plt.subplot2grid((1, 7), (0, 0), colspan=1) # ip
367 | ax1 = plt.subplot2grid((1, 7), (0, 1), colspan=1) # vp/vs
368 | ax2 = plt.subplot2grid((1, 7), (0, 2), colspan=1) # synthetic @ 0 deg
369 | ax3 = plt.subplot2grid((1, 7), (0, 3), colspan=1) # synthetic @ 30 deg
370 | ax4 = plt.subplot2grid((1, 7), (0, 4), colspan=3) # avo curve
371 |
372 | ax0.plot(model_ip, model_z, **opt3)
373 | ax0.locator_params(axis='x', nbins=1)
374 | ax0.set_xlabel('$I_\mathrm{P}$')
375 | ax0.set_xlim(4500, 7500)
376 |
377 | ax1.plot(model_vpvs, model_z, **opt3)
378 | ax1.set_xlabel('$V_\mathrm{P} / V_\mathrm{S}$')
379 | ax1.set_xlim(1., 3.)
380 |
381 | ax2.plot(synt0, model_z, **opt3)
382 | ax2.fill_betweenx(model_z, 0, synt0, where=synt0>0, facecolor='black', **opt4)
383 | ax2.set_xlim(-clip, clip)
384 | ax2.set_xlabel('angle = {:.0f}'.format(ang[0]))
385 | ax2.set_xticklabels([])
386 |
387 | ax3.plot(synt1, model_z, **opt3)
388 | ax3.fill_betweenx(model_z, 0, synt1, where=synt1>0, facecolor='black', **opt4)
389 | ax3.set_xlim(-clip, clip)
390 | ax3.set_xlabel('angle = {:.0f}'.format(ang[-1]))
391 | ax3.set_xticklabels([])
392 |
393 | ax4.plot(ang, avo, **opt3)
394 | # ax4.axhline(0, color='k', lw=2)
395 | ax4.hlines(y=0, xmin=0, xmax=30, color='k', lw=2)
396 | ax4.set_xlabel('Angle of Incidence')
397 | ax4.set_ylabel('Amplitude', )
398 | ax4.tick_params(which='major', labelsize=8)
399 | ax4.yaxis.set_label_coords(0.08, 0.5)
400 | ax4.xaxis.set_label_coords(0.5, 0.06)
401 | ax4.set_ylim(-.1, .2)
402 | ax4.set_xlim(0, 30)
403 |
404 | for aa in [ax0, ax1, ax2, ax3]:
405 | aa.set_ylim(350, 150)
406 | aa.tick_params(which='major', labelsize=8)
407 | aa.set_yticklabels([])
408 | aa.set_yticks([])
409 | plt.subplots_adjust(wspace=.6, left=0.05, right=0.95, top=.85)
410 |
411 | plt.savefig('Figure_4_AADM.png', dpi=300, bbox_inches='tight')
412 | plt.savefig('Figure_4_AADM.pdf', dpi=300, bbox_inches='tight')
413 |
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/.gitignore:
--------------------------------------------------------------------------------
1 | # Byte-compiled / optimized / DLL files
2 | __pycache__/
3 | *.py[cod]
4 | *$py.class
5 |
6 | # C extensions
7 | *.so
8 |
9 | # Distribution / packaging
10 | .Python
11 | env/
12 | build/
13 | develop-eggs/
14 | dist/
15 | downloads/
16 | eggs/
17 | .eggs/
18 | lib/
19 | lib64/
20 | parts/
21 | sdist/
22 | var/
23 | *.egg-info/
24 | .installed.cfg
25 | *.egg
26 |
27 | # PyInstaller
28 | # Usually these files are written by a python script from a template
29 | # before PyInstaller builds the exe, so as to inject date/other infos into it.
30 | *.manifest
31 | *.spec
32 |
33 | # Installer logs
34 | pip-log.txt
35 | pip-delete-this-directory.txt
36 |
37 | # Unit test / coverage reports
38 | htmlcov/
39 | .tox/
40 | .coverage
41 | .coverage.*
42 | .cache
43 | nosetests.xml
44 | coverage.xml
45 | *,cover
46 | .hypothesis/
47 |
48 | # Translations
49 | *.mo
50 | *.pot
51 |
52 | # Django stuff:
53 | *.log
54 |
55 | # Sphinx documentation
56 | docs/_build/
57 |
58 | # PyBuilder
59 | target/
60 |
61 | #Jupyter Notebook
62 | .ipynb_checkpoints
63 | Untitled.ipynb
64 |
65 | # Downloaded files
66 | *.msh
67 | *.p
68 | *.dat
69 | *.topo
70 | *.inp
71 | *.obs
72 | *.sus
73 |
74 | computation.sublime-project
75 | computation.sublime-workspace
76 |
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/Appendix_B_MT1D_tests.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "code",
5 | "execution_count": 2,
6 | "metadata": {
7 | "collapsed": true
8 | },
9 | "outputs": [],
10 | "source": [
11 | "from MT1D import MT1DProblem, MT1DSurvey, MT1DSrc, ZxyRx, Survey, AppResPhaRx\n",
12 | "from SimPEG import Maps, DataMisfit\n",
13 | "from scipy.constants import mu_0\n",
14 | "import numpy as np"
15 | ]
16 | },
17 | {
18 | "cell_type": "markdown",
19 | "metadata": {},
20 | "source": [
21 | "# Put all things together to SimPEG Problem\n",
22 | "\n",
23 | "In the [1_MT1D_NumericalSetup](./1_MT1D_NumericalSetup.ipynb) notebook, we coded up a 1D MT simulation function that computes complex impedances at multiple frequencies for a given conductivity model. To invert MT data in 1D using gradient-based optimization, sensitivity functions were derived, coded up, and tested in [Appendix_A_MT1D_Sensitivity](./Appendix_A_MT1D_Sensitivity.ipynb) notebook. Basically those are three funcionalities:\n",
24 | "\n",
25 | "- `dpred(m)`: takes model and predict MT data for a given model, `m`\n",
26 | "\n",
27 | "- `Jvec(m,v)`: takes model and a vector `v`, then computes sensitivity-vector product. \n",
28 | "\n",
29 | "- `Jtvec(m,v)`: takes model and a vector `v`, then computes adjoint sensitivity-vector product. \n",
30 | "\n",
31 | "Now we put all these things to `SimPEG`'s framework. "
32 | ]
33 | },
34 | {
35 | "cell_type": "markdown",
36 | "metadata": {},
37 | "source": [
38 | "## `SimPEG` framework\n",
39 | "\n",
40 | "Our setup of the simluation follows the [SimPEG framework](http://simpeg.xyz). \n",
41 | "\n",
42 | "
\n",
43 | "\n",
44 | "\n",
45 | "For more details, see the [SimPEG docs](http://docs.simpeg.xyz)\n",
46 | "\n",
47 | "- `Mesh`: mesh geometry and differential operators\n",
48 | "- `Problem`: physics engine. contains the machinery to construct and solve the PDE\n",
49 | "- `Survey`: sources and receivers\n",
50 | "- `Src`: sources\n",
51 | "- `Rx`: receivers\n",
52 | "\n",
53 | "`Problem` class in `SimPEG` is a physics. It discretizes the earth and computes fields in a discretized domain, and here we use `Mesh` class. For an MT problem, Maxwell's equations are used, and electromagnetic fields are computed. To do this, we need to know details about MT survey (e.g. frequencies and location of source and receivers), and they are defined in `Survey` class. `Survey` class takes `Src` class, and `Src` class takes `Rx` class. Therefore, both information in sources and receivers can be aware in the `Survey`.\n",
54 | "\n",
55 | "### Mapping\n",
56 | "\n",
57 | "For simulation, we do need to input discretized physical property. For instance in 1D MT problem values of conductivity at each cell is required. However, when consdiering inversion, inversion model can be different from physical property (e.g. conductivity). For instance, often in electromagnetic (EM) inversions logarithmic conductivity was used as an inversion model: $\\mathbf{m} = log(\\boldsymbol{\\sigma})$. While inversion process, still simulation is required to predict data hence updated model, $\\mathbf{m}$ has to be converted to $\\boldsymbol{\\sigma}$, which is a discretized physical property. Here we define a mapping:\n",
58 | "\n",
59 | "$$ \\sigma = \\mathcal{M}(\\mathbf{m}) $$\n",
60 | "\n",
61 | "mapping is a function which takes an inversion model, and outputs physical property used in simulation. For more details see: http://docs.simpeg.xyz/content/api_core/api_Maps.html. "
62 | ]
63 | },
64 | {
65 | "cell_type": "markdown",
66 | "metadata": {},
67 | "source": [
68 | "## Codes:\n",
69 | "\n",
70 | "Taking snippets of codes written in [1_MT1D_NumericalSetup](./1_MT1D_NumericalSetup.ipynb) and [Appendix_A_MT1D_Sensitivity](./Appendix_A_MT1D_Sensitivity.ipynb), we generated the `Problem`, `Survey`, `Src`, and `Rx` classes for 1D MT problem. And here are lists of classes:\n",
71 | "\n",
72 | "- `MT1DProblem`: This includes functions: `dpred(m)`, `Jvec(m,v)`, `Jtvec(m,v)`\n",
73 | "- `MT1DSurvey`: Need to input `MT1DSrc`\n",
74 | "- `MT1DSrc`: Need to input `ZxyRx`\n",
75 | "- `ZxyRx`: Receiver class / Real and Imaginary part of $Z_{xy}$"
76 | ]
77 | },
78 | {
79 | "cell_type": "code",
80 | "execution_count": 3,
81 | "metadata": {},
82 | "outputs": [
83 | {
84 | "name": "stdout",
85 | "output_type": "stream",
86 | "text": [
87 | ">> Smallest cell size = 50 m\n",
88 | ">> Padding distance = 316227 m\n",
89 | ">> # of padding cells 17\n",
90 | ">> # of core cells cells 16\n"
91 | ]
92 | }
93 | ],
94 | "source": [
95 | "rxloc = np.r_[0.]\n",
96 | "srcloc = np.r_[0.]\n",
97 | "frequency = np.logspace(-3, 2, 25)\n",
98 | "\n",
99 | "# Rx\n",
100 | "rx = ZxyRx(rxloc, component=\"both\", frequency=frequency)\n",
101 | "rxList = [rx]\n",
102 | "\n",
103 | "# Src\n",
104 | "src = MT1DSrc(rxList, loc=srcloc)\n",
105 | "\n",
106 | "# Survey\n",
107 | "survey = MT1DSurvey([src])\n",
108 | "mesh = survey.setMesh(\n",
109 | " sigma=0.01, max_depth_core=5000., \n",
110 | " ncell_per_skind=10, n_skind=2, \n",
111 | " core_meshType=\"log\", max_hz_core=1000.\n",
112 | ")\n",
113 | "\n",
114 | "# Physical property: Conductivity\n",
115 | "sigma = np.ones(mesh.nC) * 0.01\n",
116 | "\n",
117 | "# Problem\n",
118 | "prob = MT1DProblem(mesh, sigmaMap=Maps.ExpMap(mesh), verbose=False)\n",
119 | "prob.pair(survey)"
120 | ]
121 | },
122 | {
123 | "cell_type": "markdown",
124 | "metadata": {},
125 | "source": [
126 | "## Order and Adjoint tests \n",
127 | "\n",
128 | "We perform both order and adjoint tests shown in [Appendix_A_MT1D_Sensitivity](./Appendix_A_MT1D_Sensitivity.ipynb) using 1D MT problem in `SimPEG`'s framework. "
129 | ]
130 | },
131 | {
132 | "cell_type": "markdown",
133 | "metadata": {},
134 | "source": [
135 | "### Order test: `Jvec`"
136 | ]
137 | },
138 | {
139 | "cell_type": "code",
140 | "execution_count": 4,
141 | "metadata": {},
142 | "outputs": [
143 | {
144 | "name": "stdout",
145 | "output_type": "stream",
146 | "text": [
147 | "==================== checkDerivative ====================\n",
148 | "iter h |ft-f0| |ft-f0-h*J0*dx| Order\n",
149 | "---------------------------------------------------------\n",
150 | " 0 1.00e-01 2.669e-01 5.676e-02 nan\n",
151 | " 1 1.00e-02 2.151e-02 4.914e-04 2.063\n",
152 | " 2 1.00e-03 2.106e-03 4.846e-06 2.006\n",
153 | "========================= PASS! =========================\n",
154 | "Awesome, Sgkang, just awesome.\n",
155 | "\n"
156 | ]
157 | },
158 | {
159 | "data": {
160 | "text/plain": [
161 | "True"
162 | ]
163 | },
164 | "execution_count": 4,
165 | "metadata": {},
166 | "output_type": "execute_result"
167 | }
168 | ],
169 | "source": [
170 | "from SimPEG import Tests\n",
171 | "def derChk(m):\n",
172 | " return [survey.dpred(m), lambda mx: prob.Jvec(m, mx)]\n",
173 | "Tests.checkDerivative(derChk, np.log(sigma), plotIt=False, num=3, eps=1e-20, dx=np.log(sigma)*2)"
174 | ]
175 | },
176 | {
177 | "cell_type": "markdown",
178 | "metadata": {},
179 | "source": [
180 | "### Order test: `Jtvec`"
181 | ]
182 | },
183 | {
184 | "cell_type": "code",
185 | "execution_count": 5,
186 | "metadata": {},
187 | "outputs": [
188 | {
189 | "name": "stdout",
190 | "output_type": "stream",
191 | "text": [
192 | "SimPEG.DataMisfit.l2_DataMisfit assigning default eps of 1e-5 * ||dobs||\n"
193 | ]
194 | }
195 | ],
196 | "source": [
197 | "# Evaluate predicted data\n",
198 | "pred = survey.dpred(np.log(sigma))\n",
199 | "survey.dobs = pred\n",
200 | "dmis = DataMisfit.l2_DataMisfit(survey)\n",
201 | "m0 = np.log(sigma)*2."
202 | ]
203 | },
204 | {
205 | "cell_type": "code",
206 | "execution_count": 6,
207 | "metadata": {},
208 | "outputs": [
209 | {
210 | "name": "stdout",
211 | "output_type": "stream",
212 | "text": [
213 | "==================== checkDerivative ====================\n",
214 | "iter h |ft-f0| |ft-f0-h*J0*dx| Order\n",
215 | "---------------------------------------------------------\n",
216 | " 0 1.00e-01 1.074e+06 4.010e+05 nan\n",
217 | " 1 1.00e-02 7.038e+04 3.059e+03 2.118\n",
218 | " 2 1.00e-03 6.762e+03 2.982e+01 2.011\n",
219 | " 3 1.00e-04 6.735e+02 2.975e-01 2.001\n",
220 | "========================= PASS! =========================\n",
221 | "Awesome, Sgkang, just awesome.\n",
222 | "\n"
223 | ]
224 | },
225 | {
226 | "data": {
227 | "text/plain": [
228 | "True"
229 | ]
230 | },
231 | "execution_count": 6,
232 | "metadata": {},
233 | "output_type": "execute_result"
234 | }
235 | ],
236 | "source": [
237 | "Tests.checkDerivative(\n",
238 | " lambda m: [dmis(m), dmis.deriv(m)],\n",
239 | " m0,\n",
240 | " plotIt=False,\n",
241 | " num=4,\n",
242 | " dx = m0*1.\n",
243 | ")"
244 | ]
245 | },
246 | {
247 | "cell_type": "markdown",
248 | "metadata": {},
249 | "source": [
250 | "### Adjoint test"
251 | ]
252 | },
253 | {
254 | "cell_type": "code",
255 | "execution_count": 7,
256 | "metadata": {},
257 | "outputs": [
258 | {
259 | "name": "stdout",
260 | "output_type": "stream",
261 | "text": [
262 | "('Adjoint Test', 0.0, True)\n"
263 | ]
264 | }
265 | ],
266 | "source": [
267 | "v = np.random.rand(mesh.nC)\n",
268 | "w = np.random.rand(pred.shape[0])\n",
269 | "wtJv = w.dot(prob.Jvec(m0, v))\n",
270 | "vtJtw = v.dot(prob.Jtvec(m0, w))\n",
271 | "passed = np.abs(wtJv - vtJtw) < 1e-10\n",
272 | "print('Adjoint Test', np.abs(wtJv - vtJtw), passed)"
273 | ]
274 | },
275 | {
276 | "cell_type": "markdown",
277 | "metadata": {},
278 | "source": [
279 | "## Ready to run an inversion\n",
280 | "\n",
281 | "Once you have created the `Survey` and `Problem` classes so that you can compute predicted data (`dpred`), forward and adjoint sensitivity-vector products (`Jvec` and `Jtvec`), you are all set to run inversion using `SimPEG`'s inverersion framework. Check out the examples in [3_MT1D_5layer_inversion](./3_MT1D_5layer_inversion.ipynb) and [1_MT1D_NumericalSetup](./1_MT1D_NumericalSetup.ipynb).\n"
282 | ]
283 | }
284 | ],
285 | "metadata": {
286 | "anaconda-cloud": {},
287 | "kernelspec": {
288 | "display_name": "Python [default]",
289 | "language": "python",
290 | "name": "python2"
291 | },
292 | "language_info": {
293 | "codemirror_mode": {
294 | "name": "ipython",
295 | "version": 2
296 | },
297 | "file_extension": ".py",
298 | "mimetype": "text/x-python",
299 | "name": "python",
300 | "nbconvert_exporter": "python",
301 | "pygments_lexer": "ipython2",
302 | "version": "2.7.13"
303 | }
304 | },
305 | "nbformat": 4,
306 | "nbformat_minor": 2
307 | }
308 |
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2017 GeoSci Developers
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/MT1D.py:
--------------------------------------------------------------------------------
1 | from SimPEG import (
2 | Problem, Utils, Maps, Props, Mesh, Tests, Survey, Solver as SimpegSolver
3 | )
4 | import numpy as np
5 | import scipy.sparse as sp
6 | import properties
7 | from scipy.constants import mu_0
8 |
9 |
10 | class MT1DSurvey(Survey.BaseSurvey):
11 |
12 | def __init__(self, srcList, **kwargs):
13 | self.srcList = srcList
14 | Survey.BaseSurvey.__init__(self, **kwargs)
15 | self.getUniqFrequency()
16 |
17 | @property
18 | def nFreq(self):
19 | if getattr(self, '_nFreq', None) is None:
20 | self._nFreq = len(self.frequency)
21 | return self._nFreq
22 |
23 | self.getUniqueTimes()
24 |
25 | def getUniqFrequency(self):
26 | frequency_rx = []
27 |
28 | rxcount = 0
29 | for src in self.srcList:
30 | for rx in src.rxList:
31 | frequency_rx.append(rx.frequency)
32 | rxcount += 1
33 | freqs_temp = np.hstack(frequency_rx)
34 | self.frequency = np.unique(freqs_temp)
35 |
36 | # TODO: Generalize this so that user can omit specific datum at
37 | # certain frequencies
38 | if (len(freqs_temp) != rxcount * self.nFreq):
39 | raise Exception("# of Frequency of each Rx should be same!")
40 |
41 | @property
42 | def P0(self):
43 | """
44 | Evaluation matrix at surface
45 | """
46 | if getattr(self, '_P0', None) is None:
47 | P0 = sp.coo_matrix(
48 | (
49 | np.r_[1.], (np.r_[0], np.r_[2*self.mesh.nC])),
50 | shape=(1, 2 * self.mesh.nC + 1)
51 | )
52 | self._P0 = P0.tocsr()
53 | return self._P0
54 |
55 | def eval(self, f):
56 | """
57 | Project fields to receiver locations
58 |
59 | :param Fields f: fields object
60 | :rtype: numpy.ndarray
61 | :return: data
62 | """
63 | data = Survey.Data(self)
64 | for src in self.srcList:
65 | for rx in src.rxList:
66 | data[src, rx] = rx.eval(src, f, self.P0)
67 | return data
68 |
69 | def evalDeriv(self):
70 | raise Exception('Use Receivers to project fields deriv.')
71 |
72 | def setMesh(self, sigma=0.1, max_depth_core=3000., ncell_per_skind=10, n_skind=2, core_meshType="linear", max_hz_core=None):
73 |
74 | """
75 | Set 1D Mesh based using skin depths
76 |
77 | """
78 | rho = 1./sigma
79 | fmin, fmax = self.frequency.min(), self.frequency.max()
80 | print (
81 | (">> Smallest cell size = %d m") % (500*np.sqrt(rho/fmax) / ncell_per_skind)
82 | )
83 | print (
84 | (">> Padding distance = %d m") % (500*np.sqrt(rho/fmin) * n_skind)
85 | )
86 | cs = 500*np.sqrt(rho/fmax) / ncell_per_skind
87 | length_bc = 500*np.sqrt(100/fmin) * n_skind
88 |
89 | if core_meshType == "linear":
90 |
91 | max_hz_core = cs
92 |
93 | elif core_meshType == "log":
94 |
95 | if max_hz_core is None:
96 | max_hz_core = cs * 10
97 |
98 | ncz = 2
99 | hz_core = np.logspace(np.log10(cs), np.log10(max_hz_core), ncz)
100 |
101 | while hz_core.sum() < max_depth_core:
102 | ncz += 1
103 | hz_core = np.logspace(np.log10(cs), np.log10(max_hz_core), ncz)
104 |
105 | npad = 1
106 | blength = max_hz_core*1.3**(np.arange(npad)+1)
107 |
108 | while blength < length_bc:
109 | npad += 1
110 | blength = (max_hz_core*1.3**(np.arange(npad)+1)).sum()
111 | print (
112 | (">> # of padding cells %d") % (npad)
113 | )
114 |
115 | if core_meshType == "linear":
116 | ncz = int(max_depth_core / cs)
117 | hz = [(cs, npad, -1.3), (cs, ncz)]
118 | elif core_meshType == "log":
119 | hz_pad = max_hz_core * 1.3**(np.arange(npad)+1)
120 | hz = np.r_[hz_pad[::-1], hz_core[::-1]]
121 |
122 | print (
123 | (">> # of core cells cells %d") % (ncz)
124 | )
125 | mesh = Mesh.TensorMesh([hz], x0='N')
126 |
127 | return mesh
128 |
129 |
130 | class MT1DSrc(Survey.BaseSrc):
131 | """
132 | Source class for MT1D
133 | We assume a boundary condition of Ex (z=0) = 1
134 | """
135 | loc = np.r_[0.]
136 |
137 |
138 | class ZxyRx(Survey.BaseRx):
139 |
140 | def __init__(self, locs, component=None, frequency=None):
141 | self.component = component
142 | self.frequency = frequency
143 | Survey.BaseRx.__init__(self, locs, rxType=None)
144 |
145 | def eval(self, src, f, P0):
146 | Zxy = - 1./(P0*f)
147 | if self.component == "real":
148 | return Zxy.real
149 | elif self.component == "imag":
150 | return Zxy.imag
151 | elif self.component == "both":
152 | return np.r_[Zxy.real, Zxy.imag]
153 | else:
154 | raise NotImplementedError('must be real, imag or both')
155 |
156 | def evalDeriv(self, f, freq, P0, df_dm_v=None, v=None, adjoint=False):
157 |
158 | if adjoint:
159 |
160 | if self.component == "real":
161 | PTvr = (P0.T*v).astype(complex)
162 | dZr_dfT_v = Utils.sdiag((1./(f**2)))*PTvr
163 | return dZr_dfT_v
164 | elif self.component == "imag":
165 | PTvi = P0.T*v*-1j
166 | dZi_dfT_v = Utils.sdiag((1./(f**2)))*PTvi
167 | return dZi_dfT_v
168 | elif self.component == "both":
169 | PTvr = (P0.T*np.r_[v[0]]).astype(complex)
170 | PTvi = P0.T*np.r_[v[1]]*-1j
171 | dZr_dfT_v = Utils.sdiag((1./(f**2)))*PTvr
172 | dZi_dfT_v = Utils.sdiag((1./(f**2)))*PTvi
173 | return dZr_dfT_v + dZi_dfT_v
174 | else:
175 | raise NotImplementedError('must be real, imag or both')
176 |
177 | else:
178 |
179 | dZd_dm_v = P0 * (Utils.sdiag(1./(f**2)) * df_dm_v)
180 |
181 | if self.component == "real":
182 | return dZd_dm_v.real
183 | elif self.component == "imag":
184 | return dZd_dm_v.imag
185 | elif self.component == "both":
186 | return np.r_[dZd_dm_v.real, dZd_dm_v.imag]
187 | else:
188 | raise NotImplementedError('must be real, imag or both')
189 |
190 | @property
191 | def nD(self):
192 | if self.component == "both":
193 | return len(self.frequency) * 2
194 | else:
195 | return len(self.frequency)
196 |
197 |
198 | class AppResPhaRx(ZxyRx):
199 |
200 | def __init__(self, locs, component=None, frequency=None):
201 | super(AppResPhaRx, self).__init__(locs, component, frequency)
202 |
203 | def eval(self, src, f, P0):
204 | Zxy = - 1./(P0*f)
205 | omega = 2*np.pi*self.frequency
206 | if self.component == "appres":
207 | appres = abs(Zxy)**2 / (mu_0*omega)
208 | return appres
209 | elif self.component == "phase":
210 | phase = np.rad2deg(np.arctan(Zxy.imag / Zxy.real))
211 | return phase
212 | elif self.component == "both":
213 | appres = abs(Zxy)**2 / (mu_0*omega)
214 | phase = np.rad2deg(np.arctan(Zxy.imag / Zxy.real))
215 | return np.r_[appres, phase]
216 | else:
217 | raise NotImplementedError('must be appres, phase or both')
218 |
219 | def evalDeriv(self, f, freq, P0, df_dm_v=None, v=None, adjoint=False):
220 |
221 | Zxy = - 1./(P0*f)
222 | omega = 2*np.pi*freq
223 |
224 | if adjoint:
225 |
226 | dZa_dZ = Zxy / abs(Zxy)
227 | dappres_dZa = 2. * abs(Zxy) / (mu_0*omega)
228 | dappres_dZ = (dappres_dZa * dZa_dZ)
229 |
230 | if self.component == "appres":
231 | dappres_dZT_v = dappres_dZ.conj() * np.r_[v]
232 | dappres_dfT_v = Utils.sdiag((1./(f**2)))*(P0.T*dappres_dZT_v)
233 | return dappres_dfT_v
234 | elif self.component == "phase":
235 | return np.zeros_like(dappres_dfT_v)
236 | elif self.component == "both":
237 | dappres_dZT_v = dappres_dZ.conj() * np.r_[v[0]]
238 | dappres_dfT_v = Utils.sdiag((1./(f**2)))*(P0.T*dappres_dZT_v)
239 | return dappres_dfT_v
240 | else:
241 | raise NotImplementedError('must be real, imag or both')
242 |
243 | else:
244 |
245 | dZ_dm_v = P0 * (Utils.sdiag(1./(f**2)) * df_dm_v)
246 |
247 | dZa_dZ = Zxy.conjugate() / abs(Zxy)
248 | dappres_dZa = 2. * abs(Zxy) / (mu_0*omega)
249 | dappres_dZ = dappres_dZa * dZa_dZ
250 | dappres_dm_v = (dappres_dZ * dZ_dm_v).real
251 |
252 | if self.component == "appres":
253 | return dappres_dm_v
254 | elif self.component == "phase":
255 | return np.zeros_like(dappres_dm_v)
256 | elif self.component == "both":
257 | return np.r_[dappres_dm_v, np.zeros_like(dappres_dm_v)]
258 | else:
259 | raise NotImplementedError('must be appres, phase or both')
260 |
261 |
262 | class MT1DProblem(Problem.BaseProblem):
263 | """
264 | 1D Magnetotelluric problem under quasi-static approximation
265 |
266 | """
267 |
268 | sigma, sigmaMap, sigmaDeriv = Props.Invertible(
269 | "Electrical conductivity (S/m)"
270 | )
271 |
272 | rho, rhoMap, rhoDeriv = Props.Invertible(
273 | "Electrical resistivity (Ohm-m)"
274 | )
275 |
276 | Props.Reciprocal(sigma, rho)
277 |
278 | mu = Props.PhysicalProperty(
279 | "Magnetic Permeability (H/m)",
280 | default=mu_0
281 | )
282 |
283 | surveyPair = Survey.BaseSurvey #: The survey to pair with.
284 | dataPair = Survey.Data #: The data to pair with.
285 |
286 | mapPair = Maps.IdentityMap #: Type of mapping to pair with
287 |
288 | Solver = SimpegSolver #: Type of solver to pair with
289 | solverOpts = {} #: Solver options
290 |
291 | verbose = False
292 | f = None
293 |
294 | def __init__(self, mesh, **kwargs):
295 | Problem.BaseProblem.__init__(self, mesh, **kwargs)
296 | # Setup boundary conditions
297 | mesh.setCellGradBC([['dirichlet', 'dirichlet']])
298 |
299 | @property
300 | def deleteTheseOnModelUpdate(self):
301 | if self.verbose:
302 | print ("Delete Matrices")
303 | toDelete = []
304 | if self.sigmaMap is not None or self.rhoMap is not None:
305 | toDelete += ['_MccSigma', '_Ainv', '_ATinv']
306 | return toDelete
307 |
308 | @property
309 | def Exbc(self):
310 | """
311 | Boundary value for Ex
312 | """
313 | if getattr(self, '_Exbc', None) is None:
314 | self._Exbc = np.r_[0., 1.]
315 | return self._Exbc
316 |
317 | ####################################################
318 | # Mass Matrices
319 | ####################################################
320 |
321 | @property
322 | def MccSigma(self):
323 | """
324 | Diagonal matrix for \\(\\sigma\\).
325 | """
326 | if getattr(self, '_MccSigma', None) is None:
327 | self._MccSigma = Utils.sdiag(self.sigma)
328 | return self._MccSigma
329 |
330 | def MccSigmaDeriv(self, u):
331 | """
332 | Derivative of MccSigma with respect to the model
333 | """
334 | if self.sigmaMap is None:
335 | return Utils.Zero()
336 |
337 | return (
338 | Utils.sdiag(u) * self.sigmaDeriv
339 | )
340 |
341 | @property
342 | def MccEpsilon(self):
343 | """
344 | Diagonal matrix for \\(\\epsilon\\).
345 | """
346 | if getattr(self, '_MccEpsilon', None) is None:
347 | self._MccEpsilon = Utils.sdiag(self.epsilon)
348 | return self._MccEpsilon
349 |
350 | @property
351 | def MfMu(self):
352 | """
353 | Edge inner product matrix for \\(\\mu\\).
354 | """
355 | if getattr(self, '_MMfMu', None) is None:
356 | self._MMfMu = Utils.sdiag(
357 | self.mesh.aveCC2F * self.mu * np.ones(self.mesh.nC)
358 | )
359 | return self._MMfMu
360 |
361 | ####################################################
362 | # Physics?
363 | ####################################################
364 |
365 | def getA(self, freq):
366 | """
367 | .. math::
368 |
369 | \mathbf{A} =
370 | \begin{bmatrix}
371 | \mathbf{Grad} & \imath \omega \mathbf{M}^{f2cc}_{\mu} \\[0.3em]
372 | \mathbf{M}^{cc}_{\hat{\sigma}} & \mathbf{Div} \\[0.3em]
373 | \end{bmatrix}
374 |
375 | """
376 |
377 | Div = self.mesh.faceDiv
378 | Grad = self.mesh.cellGrad
379 | omega = 2*np.pi*freq
380 | A = sp.vstack(
381 | (
382 | sp.hstack((Grad, 1j*omega*self.MfMu)),
383 | sp.hstack((self.MccSigma, Div))
384 | )
385 | )
386 | return A
387 |
388 | @property
389 | def Ainv(self):
390 | if getattr(self, '_Ainv', None) is None:
391 | if self.verbose:
392 | print ("Factorize A matrix")
393 | self._Ainv = []
394 | for freq in self.survey.frequency:
395 | self._Ainv.append(self.Solver(self.getA(freq)))
396 | return self._Ainv
397 |
398 | @property
399 | def ATinv(self):
400 | if getattr(self, '_ATinv', None) is None:
401 | if self.verbose:
402 | print ("Factorize AT matrix")
403 | self._ATinv = []
404 | for freq in self.survey.frequency:
405 | self._ATinv.append(self.Solver(self.getA(freq).T))
406 | return self._ATinv
407 |
408 | def getADeriv_sigma(self, freq, f, v, adjoint=False):
409 | Ex = f[:self.mesh.nC]
410 | dMcc_dsig = self.MccSigmaDeriv(Ex)
411 | if adjoint:
412 | return sp.hstack(
413 | (Utils.spzeros(self.mesh.nC, self.mesh.nN), dMcc_dsig.T)
414 | ) * v
415 | else:
416 | return np.r_[np.zeros(self.mesh.nC+1), dMcc_dsig*v]
417 |
418 | def getRHS(self, freq):
419 | """
420 | .. math::
421 |
422 | \mathbf{rhs} =
423 | \begin{bmatrix}
424 | - \mathbf{B}\mathbf{E}_x^{bc} \\ [0.3em]
425 | \boldsymbol{0} \\[0.3em]
426 | \end{bmatrix}$
427 |
428 | """
429 | B = self.mesh.cellGradBC
430 | RHS = np.r_[-B*self.Exbc, np.zeros(self.mesh.nC)]
431 | return RHS
432 |
433 | def fields(self, m=None):
434 | if self.verbose:
435 | print (">> Compute fields")
436 |
437 | if m is not None:
438 | self.model = m
439 |
440 | f = np.zeros(
441 | (int(self.mesh.nC*2+1), self.survey.nFreq), dtype="complex"
442 | )
443 |
444 | for ifreq, freq in enumerate(self.survey.frequency):
445 | f[:, ifreq] = self.Ainv[ifreq] * self.getRHS(freq)
446 | return f
447 |
448 | def Jvec(self, m, v, f=None):
449 |
450 | if f is None:
451 | f = self.fields(m)
452 |
453 | Jv = []
454 |
455 | for src in self.survey.srcList:
456 | for rx in src.rxList:
457 | for ifreq, freq in enumerate(self.survey.frequency):
458 | dA_dm_f_v = self.getADeriv_sigma(freq, f[:, ifreq], v)
459 | df_dm_v = - (self.Ainv[ifreq] * dA_dm_f_v)
460 | Jv.append(
461 | rx.evalDeriv(
462 | f[:, ifreq], freq, self.survey.P0, df_dm_v=df_dm_v
463 | )
464 | )
465 | return np.hstack(Jv)
466 |
467 | def Jtvec(self, m, v, f=None):
468 |
469 | if f is None:
470 | f = self.fields(m)
471 | # Ensure v is a data object.
472 |
473 | if not isinstance(v, self.dataPair):
474 | v = self.dataPair(self.survey, v)
475 |
476 | Jtv = np.zeros(m.size)
477 |
478 | for src in self.survey.srcList:
479 | for rx in src.rxList:
480 | for ifreq, freq in enumerate(self.survey.frequency):
481 | if rx.component == "both":
482 | v_temp = v[src, rx].reshape(
483 | (self.survey.nFreq, 2)
484 | )[ifreq, :]
485 | else:
486 | v_temp = v[src, rx][ifreq]
487 |
488 | dZ_dfT_v = rx.evalDeriv(
489 | f[:, ifreq], freq, self.survey.P0,
490 | v=v_temp, adjoint=True
491 | )
492 |
493 | ATinvdZ_dfT = self.ATinv[ifreq]*dZ_dfT_v
494 | Jtv += - self.getADeriv_sigma(
495 | freq, f[:, ifreq], ATinvdZ_dfT, adjoint=True
496 | ).real
497 |
498 | return Jtv
499 |
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/MTforward.py:
--------------------------------------------------------------------------------
1 | import numpy as np
2 | import scipy.sparse as sp
3 | from scipy.constants import mu_0
4 | from SimPEG import Utils, Solver
5 |
6 |
7 | def simulateMT(mesh, sigma, frequency, rtype="app_res"):
8 | """
9 | Compute apparent resistivity and phase at each frequency.
10 | Return apparent resistivity and phase for rtype="app_res",
11 | or impedance for rtype="impedance"
12 | """
13 |
14 | # Angular frequency (rad/s)
15 | def omega(freq):
16 | return 2*np.pi*freq
17 |
18 | # make sure we are working with numpy arrays
19 | if type(frequency) is float:
20 | frequency = np.r_[frequency] # make it a list to loop over later if it is just a scalar
21 | elif type(frequency) is list:
22 | frequency = np.array(frequency)
23 |
24 | # Grad
25 | mesh.setCellGradBC([['dirichlet', 'dirichlet']]) # Setup boundary conditions
26 | Grad = mesh.cellGrad # Gradient matrix
27 |
28 | # MfMu
29 | mu = np.ones(mesh.nC)*mu_0 # magnetic permeability values for all cells
30 | Mmu = Utils.sdiag(mesh.aveCC2F * mu)
31 |
32 | # Mccsigma
33 | sigmahat = sigma # quasi-static assumption
34 | Msighat = Utils.sdiag(sigmahat)
35 |
36 | # Div
37 | Div = mesh.faceDiv # Divergence matrix
38 |
39 | # Right Hand Side
40 | B = mesh.cellGradBC # a matrix for boundary conditions
41 | Exbc = np.r_[0., 1.] # boundary values for Ex
42 |
43 | # Right-hand side
44 | rhs = np.r_[
45 | -B*Exbc,
46 | np.zeros(mesh.nC)
47 | ]
48 |
49 | # loop over frequencies
50 | Zxy = []
51 | for freq in frequency:
52 |
53 | # A-matrix
54 | A = sp.vstack([
55 | sp.hstack([Grad, 1j*omega(freq)*Mmu]), # Top row of A matrix
56 | sp.hstack((Msighat, Div)) # Bottom row of A matrix
57 | ])
58 |
59 | Ainv = Solver(A) # Factorize A matrix
60 | sol = Ainv*rhs # Solve A^-1 rhs = sol
61 | Ex = sol[:mesh.nC] # Extract Ex from solution vector u
62 | Hy = sol[mesh.nC:mesh.nC+mesh.nN] # Extract Hy from solution vector u
63 |
64 | Zxy.append(- 1./Hy[-1]) # Impedance at the surface
65 |
66 | # turn it into an array
67 | Zxy = np.array(Zxy)
68 |
69 | if rtype.lower() == "impedance":
70 | return Zxy
71 |
72 | elif rtype.lower() == "app_res":
73 | app_res = abs(Zxy)**2 / (mu_0*omega(frequency))
74 | app_phase = np.rad2deg(np.arctan(Zxy.imag / Zxy.real))
75 | return app_res, app_phase
76 |
77 | else:
78 | raise Exception("rtype must be 'impedance' or 'app_res', not {}".format(rtype.lower()))
79 |
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/MTtutorialV0/MTtutorial.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/MTtutorialV0/MTtutorial.pdf
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/MTtutorialV0/references.bib:
--------------------------------------------------------------------------------
1 | @book{Monographs,
2 | author = {Whittall, K. and Oldenburg, D.},
3 | title = {Inversion of Magnetotelluric Data for a One-Dimensional Conductivity},
4 | publisher = {Society of Exploration Geophysicists},
5 | year = {1992},
6 | doi = {10.1190/1.9781560802419},
7 | address = {},
8 | edition = {},
9 | URL = {http://library.seg.org/doi/abs/10.1190/1.9781560802419},
10 | eprint = {http://library.seg.org/doi/pdf/10.1190/1.9781560802419}
11 | }
12 |
13 | @article{OldenburgTutorial,
14 | author = {Oldenburg, DW Douglas W. and Li, Yaoguo},
15 | doi = {10.1190/1.9781560801719},
16 | file = {:Users/lindseyjh/Documents/Research/Library/Oldenburg, Li - Unknown - 5. Inversion for Applied Geophysics A Tutorial.pdf:pdf;:Users/lindseyjh/Documents/Research/Library/Oldenburg, Li - Unknown - INVERSION FOR APPLIED GEOPHYSICS A TUTORIAL.pdf:pdf},
17 | isbn = {978-1-56080-130-6},
18 | journal = {Investigations in geophysics},
19 | mendeley-groups = {Inversions,ThesisProposal,simpegEM},
20 | month = {jan},
21 | pages = {1--85},
22 | publisher = {Society of Exploration Geophysicists},
23 | title = {{Inversion for applied geophysics: A tutorial}},
24 | url = {http://www.eoas.ubc.ca/courses/eosc454/content/Papers/Case Histories/Inversion Tutorial Oldenburg and Li 2005.pdf http://library.seg.org/doi/book/10.1190/1.9781560801719},
25 | volume = {13},
26 | year = {2005}
27 | }
28 |
29 | @article{SimPEGPaper,
30 | author = {Cockett, Rowan and Kang, Seogi and Heagy, Lindsey J. and Pidlisecky, Adam and Oldenburg, Douglas W.},
31 | doi = {10.1016/j.cageo.2015.09.015},
32 | file = {:Users/lindseyjh/Documents/Research/Library/1-s2.0-S009830041530056X-main.pdf:pdf},
33 | issn = {00983004},
34 | journal = {Computers {\&} Geosciences},
35 | keywords = {Electromagnetics,Geophysics,Inversion,Numerical modeling,Object-oriented programming,Sensitivities},
36 | mendeley-groups = {ThesisProposal,simpegEM,EM-6,CasingPaper},
37 | month = {dec},
38 | pages = {142--154},
39 | publisher = {Elsevier},
40 | title = {{SimPEG: An open source framework for simulation and gradient based parameter estimation in geophysical applications}},
41 | url = {http://linkinghub.elsevier.com/retrieve/pii/S009830041530056X},
42 | volume = {85},
43 | year = {2015}
44 | }
45 |
46 |
47 | @article{HallTutorial,
48 | author = { Matt Hall },
49 | title = {Linear inversion},
50 | journal = {The Leading Edge},
51 | volume = {35},
52 | number = {12},
53 | pages = {1085-1087},
54 | year = {2016},
55 | doi = {10.1190/tle35121085.1},
56 |
57 | URL = {
58 | https://doi.org/10.1190/tle35121085.1
59 |
60 | },
61 | eprint = {
62 | https://doi.org/10.1190/tle35121085.1
63 |
64 | }
65 |
66 | }
67 |
68 | @article{Cockett2016,
69 | author = {Rowan Cockett and Lindsey J. Heagy and Douglas W. Oldenburg},
70 | title = {Pixels and their neighbors: Finite volume},
71 | journal = {The Leading Edge},
72 | volume = {35},
73 | number = {8},
74 | pages = {703-706},
75 | year = {2016},
76 | doi = {10.1190/tle35080703.1},
77 |
78 | URL = {
79 | https://doi.org/10.1190/tle35080703.1
80 |
81 | },
82 | eprint = {
83 | https://doi.org/10.1190/tle35080703.1
84 |
85 | }
86 |
87 | }
88 |
89 |
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/README.md:
--------------------------------------------------------------------------------
1 | Exploring non-linear inversions: a 1D magnetotelluric example
2 | =============================================================
3 |
4 | *Seogi Kang, Lindsey Heagy, Rowan Cockett and Doug Oldenburg*
5 |
6 | The notebooks are available online at https://notebooks.azure.com/lheagy/libraries/tle-magnetotelluric-inversion
7 |
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/article.zip:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/article.zip
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/article/MTtutorial.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/article/MTtutorial.pdf
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/article/images/alphas.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/article/images/alphas.png
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/article/images/alphas_old.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/article/images/alphas_old.png
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/article/images/beta_knob.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/article/images/beta_knob.png
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/article/images/justright.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/article/images/justright.png
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/article/images/justright_old.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/article/images/justright_old.png
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/article/images/overfit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/article/images/overfit.png
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/article/images/overfit_old.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/article/images/overfit_old.png
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/article/images/sigmat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/article/images/sigmat.png
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/article/images/sigmat_old.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/article/images/sigmat_old.png
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/article/images/underfit.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/article/images/underfit.png
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/article/images/underfit_old.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/article/images/underfit_old.png
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/article/references.bib:
--------------------------------------------------------------------------------
1 | @book{Monographs,
2 | author = {Whittall, K. and Oldenburg, D.},
3 | title = {Inversion of Magnetotelluric Data for a One-Dimensional Conductivity},
4 | publisher = {Society of Exploration Geophysicists},
5 | year = {1992},
6 | doi = {10.1190/1.9781560802419},
7 | address = {},
8 | edition = {},
9 | URL = {http://library.seg.org/doi/abs/10.1190/1.9781560802419},
10 | eprint = {http://library.seg.org/doi/pdf/10.1190/1.9781560802419}
11 | }
12 |
13 | @article{OldenburgTutorial,
14 | author = {Oldenburg, DW Douglas W. and Li, Yaoguo},
15 | doi = {10.1190/1.9781560801719},
16 | file = {:Users/lindseyjh/Documents/Research/Library/Oldenburg, Li - Unknown - 5. Inversion for Applied Geophysics A Tutorial.pdf:pdf;:Users/lindseyjh/Documents/Research/Library/Oldenburg, Li - Unknown - INVERSION FOR APPLIED GEOPHYSICS A TUTORIAL.pdf:pdf},
17 | isbn = {978-1-56080-130-6},
18 | journal = {Investigations in geophysics},
19 | mendeley-groups = {Inversions,ThesisProposal,simpegEM},
20 | month = {jan},
21 | pages = {1--85},
22 | publisher = {Society of Exploration Geophysicists},
23 | title = {{Inversion for applied geophysics: A tutorial}},
24 | url = {http://www.eoas.ubc.ca/courses/eosc454/content/Papers/Case Histories/Inversion Tutorial Oldenburg and Li 2005.pdf http://library.seg.org/doi/book/10.1190/1.9781560801719},
25 | volume = {13},
26 | year = {2005}
27 | }
28 |
29 | @article{SimPEGPaper,
30 | author = {Cockett, Rowan and Kang, Seogi and Heagy, Lindsey J. and Pidlisecky, Adam and Oldenburg, Douglas W.},
31 | doi = {10.1016/j.cageo.2015.09.015},
32 | file = {:Users/lindseyjh/Documents/Research/Library/1-s2.0-S009830041530056X-main.pdf:pdf},
33 | issn = {00983004},
34 | journal = {Computers {\&} Geosciences},
35 | keywords = {Electromagnetics,Geophysics,Inversion,Numerical modeling,Object-oriented programming,Sensitivities},
36 | mendeley-groups = {ThesisProposal,simpegEM,EM-6,CasingPaper},
37 | month = {dec},
38 | pages = {142--154},
39 | publisher = {Elsevier},
40 | title = {{SimPEG: An open source framework for simulation and gradient based parameter estimation in geophysical applications}},
41 | url = {http://linkinghub.elsevier.com/retrieve/pii/S009830041530056X},
42 | volume = {85},
43 | year = {2015}
44 | }
45 |
46 |
47 | @article{HallTutorial,
48 | author = { Matt Hall },
49 | title = {Linear inversion},
50 | journal = {The Leading Edge},
51 | volume = {35},
52 | number = {12},
53 | pages = {1085-1087},
54 | year = {2016},
55 | doi = {10.1190/tle35121085.1},
56 |
57 | URL = {
58 | https://doi.org/10.1190/tle35121085.1
59 |
60 | },
61 | eprint = {
62 | https://doi.org/10.1190/tle35121085.1
63 |
64 | }
65 |
66 | }
67 |
68 | @article{Cockett2016,
69 | author = {Rowan Cockett and Lindsey J. Heagy and Douglas W. Oldenburg},
70 | title = {Pixels and their neighbors: Finite volume},
71 | journal = {The Leading Edge},
72 | volume = {35},
73 | number = {8},
74 | pages = {703-706},
75 | year = {2016},
76 | doi = {10.1190/tle35080703.1},
77 |
78 | URL = {
79 | https://doi.org/10.1190/tle35080703.1
80 |
81 | },
82 | eprint = {
83 | https://doi.org/10.1190/tle35080703.1
84 |
85 | }
86 |
87 | }
88 |
89 |
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/images/1DMT_discretize.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/images/1DMT_discretize.png
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/images/ForwardProblem.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/images/ForwardProblem.png
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/index.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "# Exploring non-linear inversions: a 1D magnetotelluric example\n",
8 | "\n",
9 | "*Seogi Kang, Lindsey Heagy, Rowan Cockett and Doug Oldenburg*\n",
10 | "\n",
11 | "There are 5 notebooks in this tutorial - we wrote them starting from discretizing the governing equations for the Magnetotelluric Problem, running a forward simulation and exploring an example of non-uniqueness, and performing the inversion. Although this is a natural order in terms of building the pieces, you do not need to work through them in order, each notebook is self-contained and has links to others where appropriate. \n",
12 | "\n",
13 | "- [1_MT1D_NumericalSetup](./1_MT1D_NumericalSetup.ipynb): discretize and solve the 1D MT equations \n",
14 | "- [2_MT1D_ForwardModellingAndNonuniqueness](./2_MT1D_ForwardModellingAndNonuniqueness.ipynb): run the forward simulation and explore an example of non-uniqueness\n",
15 | "- [3_MT1D_5layer_inversion](./3_MT1D_5layer_inversion.ipynb): run inversions for a 5 layer model and explore the impacts of choosing a trade-off parameter $\\beta$, and changing the regularization parameters smoothness and smallness ($\\alpha_s$ and $\\alpha_z$). \n",
16 | "\n",
17 | "There are also 2 \"appendix\" notebooks\n",
18 | "- [Appendix_A_MT1D_Sensitivity](./Appendix_A_MT1D_Sensitivity.ipynb): derive and test the sensitivity \n",
19 | "- [Appendix_B_MT1D_tests](./Appendix_B_MT1D_tests.ipynb): demonstrates how we test the code"
20 | ]
21 | },
22 | {
23 | "cell_type": "markdown",
24 | "metadata": {
25 | "collapsed": true
26 | },
27 | "source": [
28 | "The notebooks require that you have SimPEG installed. If you do not, uncomment and run the following cell to install it. "
29 | ]
30 | },
31 | {
32 | "cell_type": "code",
33 | "execution_count": null,
34 | "metadata": {
35 | "collapsed": true
36 | },
37 | "outputs": [],
38 | "source": [
39 | "# !pip install SimPEG"
40 | ]
41 | }
42 | ],
43 | "metadata": {
44 | "kernelspec": {
45 | "display_name": "Python 2",
46 | "language": "python",
47 | "name": "python2"
48 | },
49 | "language_info": {
50 | "codemirror_mode": {
51 | "name": "ipython",
52 | "version": 2
53 | },
54 | "file_extension": ".py",
55 | "mimetype": "text/x-python",
56 | "name": "python",
57 | "nbconvert_exporter": "python",
58 | "pygments_lexer": "ipython2",
59 | "version": "2.7.13"
60 | }
61 | },
62 | "nbformat": 4,
63 | "nbformat_minor": 2
64 | }
65 |
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/mesh.ai:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1708_Nonlinear_inversion/mesh.ai
--------------------------------------------------------------------------------
/1708_Nonlinear_inversion/requirements.txt:
--------------------------------------------------------------------------------
1 | numpy
2 | scipy
3 | matplotlib
4 | ipython
5 | jupyter
6 | ipywidgets
7 | SimPEG
8 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/Figures/Figure1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1710_Colored_inversion/Figures/Figure1.png
--------------------------------------------------------------------------------
/1710_Colored_inversion/Figures/Figure2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1710_Colored_inversion/Figures/Figure2.png
--------------------------------------------------------------------------------
/1710_Colored_inversion/Figures/Figure3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1710_Colored_inversion/Figures/Figure3.png
--------------------------------------------------------------------------------
/1710_Colored_inversion/Figures/Figure4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1710_Colored_inversion/Figures/Figure4.png
--------------------------------------------------------------------------------
/1710_Colored_inversion/Figures/Figure5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1710_Colored_inversion/Figures/Figure5.png
--------------------------------------------------------------------------------
/1710_Colored_inversion/Figures/Figure6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1710_Colored_inversion/Figures/Figure6.png
--------------------------------------------------------------------------------
/1710_Colored_inversion/Figures/Figure7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1710_Colored_inversion/Figures/Figure7.png
--------------------------------------------------------------------------------
/1710_Colored_inversion/Manuscript-rev1.docx:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1710_Colored_inversion/Manuscript-rev1.docx
--------------------------------------------------------------------------------
/1710_Colored_inversion/Manuscript-rev1.ipynb:
--------------------------------------------------------------------------------
1 | {
2 | "cells": [
3 | {
4 | "cell_type": "markdown",
5 | "metadata": {},
6 | "source": [
7 | "### Geophysical Tutorial\n",
8 | "\n",
9 | "# Colored inversion\n",
10 | "\n",
11 | "Martin Blouin1 and Erwan Gloaguen2\n",
12 | "\n",
13 | "1 GeoLEARN Solutions, Quebec City, Canada\n",
14 | "2 INRS-ETE, Quebec City, Canada\n",
15 | "\n",
16 | "Corresponding author: martin.blouin@geolearn.ca\n",
17 | "\n",
18 | "Whether it is deterministic, band-limited or stochastic, seismic inversion can bear many names depending on the algorithm used to produce it. Broadly, inversion converts reflectivity data to physical properties of the earth, such as acoustic impedance, the product of seismic velocity and bulk density. This is useful because, while reflectivity informs us about boundaries, impedance can be converted to useful earth propertes such as porosity and fluid content via known petrophysical relationships.\n",
19 | "\n",
20 | "Lancaster and Whitcombe (2000) published a fast method for band-limited inversion of seismic data known as colored inversion (CI) that generated widespread interest among interpreters. Recognizing that the popular sparse-spike inversion process could be approximated by a single operator, yielding relative impedance via simple convolution with the reflectivity data, the authors showed that this operator can be derived from well logs. Like other inversions, CI can help remove the smearing effects of the seismic wavelet and enhance features such as thin beds and discontinuities. What's more, since CI is directly linked to seismic data, the relative impedance it produces can be used as a base for comparison with other inversion to see what kind of information is introduced by numerical constraints or the low-frequency model.\n",
21 | "\n",
22 | "In this tutorial, we follow the steps presented by Lancaster and Whitcombe in their 2000 expanded abstract to achieve the so-called \"fast-track colored inversion\". Using open-source algorithms, we describe all the steps to go from reflectivity data to inverted cubes:\n",
23 | "\n",
24 | "1.\tFit a function to the log spectrum(s).\n",
25 | "2.\tGet a difference spectrum by substracting the seismic spectrum.\n",
26 | "3.\tConvert the difference spectrum to an operator.\n",
27 | "4.\tConvolve the operator with the stacked seismic.\n",
28 | "5.\tAs a QC step, check the residuals by comparing log and AI section spectrums.\n",
29 | "\n",
30 | "The idea of this tutorial is to achieve a colored inversion without any external software, just Python code with the NumPy and SciPy libraries. You can read and run the code for yourself from the repository at **github.com/seg/tutorials-2017**. The tutorial focus on presenting the whole workflow in the simplest fashion rather than trying to optimize parameters to recover interpretable features. Prior to running the workflow on your data, noise attenuation should be performed to ensure that the inversion process recovers frequencies associated only with the Earth."
31 | ]
32 | },
33 | {
34 | "cell_type": "markdown",
35 | "metadata": {},
36 | "source": [
37 | "## The dataset\n",
38 | "\n",
39 | "For our demonstration, we use one inline from the 1987 Dutch F3 volume (Figure 1), plus the acoustic impedance log from the F02-1 well. Good descriptions of the geological setting of this dataset can be found in Sorensen et al. (1997) and Overeem et al. (2001). We use the dip-steered median filter stacked dataset to get reduced noise on our input."
40 | ]
41 | },
42 | {
43 | "cell_type": "markdown",
44 | "metadata": {},
45 | "source": [
46 | "\n",
47 | "*Figure 1. F3 dip-steered median filtered stacked seismic data at inline 362 with well location and bounding horizons of the inverted region.*"
48 | ]
49 | },
50 | {
51 | "cell_type": "markdown",
52 | "metadata": {},
53 | "source": [
54 | "## 1. Fit a function to the log spectrum\n",
55 | "\n",
56 | "Walden and Hosken (1984) observed that the reflectivity sequences in sedimentary basins display a logarithmic decay in amplitude as frequency increases. For the first step of our inversion, we look at the reflectivity spectrum and make sure it behaves as predicted. We load the F02-1 well, convert it to the time domain, and calculate the spectrum (Figure 2).\n",
57 | "\n",
58 | "```python\n",
59 | "n_log = AI_f021.shape[0]\n",
60 | "k_log = np.arange(n_log-1)\n",
61 | "Fs_log = 1 / np.diff(time_f021/1000)\n",
62 | "T_log = n_log / Fs_log\n",
63 | "freq_log = k_log / T_log\n",
64 | "freq_log = freq_log[range(n_log//2)]\n",
65 | "spec_log = np.fft.fft(AI_f021) / n_log\n",
66 | "spec_log = spec_log[range(n_log//2)]\n",
67 | "```"
68 | ]
69 | },
70 | {
71 | "cell_type": "markdown",
72 | "metadata": {},
73 | "source": [
74 | "
\n",
75 | "*Figure 2. F02-1 well data. (a) AI log, (b) Calculated power spectrum.*"
76 | ]
77 | },
78 | {
79 | "cell_type": "markdown",
80 | "metadata": {},
81 | "source": [
82 | "We would like to simplify the spectrum, so we proceed to a regression. To make the process more robust, CI packages offer you the option of averaging this spectrum over all the available wells, but we can skip tht as we are working with only a single well. In order to proceed to a linear regression, we define two simple functions, one that serves as the linearization of the problem and one for the error function. I then use `scipy.optimize` to find the best fit, shown in Figure 3.\n",
83 | "\n",
84 | "```python\n",
85 | "def linearize(p, x):\n",
86 | " return p[0] * x**p[1]\n",
87 | " \n",
88 | "def error(p, x, y): \n",
89 | " return np.log10(y) - np.log10(linearize(p, x))\n",
90 | "\n",
91 | "args = (freq_log[1:2000], np.abs(spec_log[1:2000]))\n",
92 | "qout, success = optimize.leastsq(error,\n",
93 | " (1e5, -0.8),\n",
94 | " args=args,\n",
95 | " maxfev=3000)\n",
96 | "```"
97 | ]
98 | },
99 | {
100 | "cell_type": "markdown",
101 | "metadata": {},
102 | "source": [
103 | "
\n",
104 | "*Figure 3. F02-1 well spectrum approximated by a linear function in log space.*"
105 | ]
106 | },
107 | {
108 | "cell_type": "markdown",
109 | "metadata": {},
110 | "source": [
111 | "## 2. Compute the difference\n",
112 | "\n",
113 | "Now we have a continuous function that mathematically approximates the well log spectrum. The next major step of the workflow is to compute an operator that is representative of the difference between the log spectrum and the seismic spectrum.\n",
114 | "\n",
115 | "We first define some boundaries to our modelled spectrum in the frequency domain. This is a critical part that will have great influence on the end result. We define a simple function to generate a 50 points Hanning shaped taper at both end of the spectrum; the result is shown in Figure 4. Then we take seismic traces next to the well location, average them, and repeat the procedure we did on the well to get the spectrum. Figure 4 shows the resulting modelled spectrum. In this example, taper windows of 0–5 Hz and 100–120 Hz have been defined. It is important to note that our end result will be greatly influenced by this choice and care should be applied at this stage."
116 | ]
117 | },
118 | {
119 | "cell_type": "markdown",
120 | "metadata": {},
121 | "source": [
122 | "
\n",
123 | "*Figure 4. Comparison of well log, seismic and modelled frequency power spectrum.*"
124 | ]
125 | },
126 | {
127 | "cell_type": "markdown",
128 | "metadata": {},
129 | "source": [
130 | "After this step is completed, we simply substract the seismic spectrum from our modelled spectrum (Figure 5)."
131 | ]
132 | },
133 | {
134 | "cell_type": "markdown",
135 | "metadata": {},
136 | "source": [
137 | "## 3. Convert to an operator\n",
138 | "\n",
139 | "Now, continuing with Lancaster & Whitcombe's methodology, we can derive an inversion operator. We move to the time domain with an inverse Fourier transform, then shift zero time to the center of the time window. Finally, we rotate the phase by taking the quadrature of the signal, represented by the imaginary component and shown in Figure 5.\n",
140 | "\n",
141 | "```python\n",
142 | "gap = spec_log_model - spec_seismic_model\n",
143 | "operator = np.fft.ifft(gap)\n",
144 | "operator = np.fft.fftshift(operator)\n",
145 | "operator = operator.imag\n",
146 | "```"
147 | ]
148 | },
149 | {
150 | "cell_type": "markdown",
151 | "metadata": {},
152 | "source": [
153 | "\n",
154 | "*Figure 5. a) Resulting difference spectrum. b) Associated operator.*"
155 | ]
156 | },
157 | {
158 | "cell_type": "markdown",
159 | "metadata": {},
160 | "source": [
161 | "## 4. Convolve operator with seismic\n",
162 | "\n",
163 | "Once the operator is calculated a simple trace by trace convolution with the reflectivity data is needed to perform colored inversion. NumPy's `apply_along_axis()` applies any function to all columns of an array, so we can pass it the convolution:\n",
164 | "\n",
165 | "```python\n",
166 | "def convolve(t):\n",
167 | " return np.convolve(t, operator, mode='same')\n",
168 | "\n",
169 | "ci = np.apply_along_axis(convolve, axis=0, arr=seis)\n",
170 | "```\n",
171 | "\n",
172 | "Since the relative impedance result contains no low frequencies, it does not inform us about trends, so it makes more sense to look at the result in a single formation. We will focus on an area of interest of about 300 ms in thickness between two horizons; Figure 6 presents the resulting relative impedance section scaled (0-1) in this area."
173 | ]
174 | },
175 | {
176 | "cell_type": "markdown",
177 | "metadata": {},
178 | "source": [
179 | "\n",
180 | "*Figure 6. Relative impedance result in a single stratigraphic unit.*"
181 | ]
182 | },
183 | {
184 | "cell_type": "markdown",
185 | "metadata": {
186 | "collapsed": true
187 | },
188 | "source": [
189 | "## 5. Check the residuals\n",
190 | "\n",
191 | "To make sure that we did a good job defining our operator, we now look at the spectrum from the relative impedance result at the well location to see if we achieved a good fit with the well log spectrum (Figure 7). It is to be noted that this fit was achieved with some arbitrary decisions, and the workflow could be iterated upon to try to minimize the difference between the two spectrums."
192 | ]
193 | },
194 | {
195 | "cell_type": "markdown",
196 | "metadata": {},
197 | "source": [
198 | "
\n",
199 | "*Figure 7. QC of the colored inversion workflow with comparison of input and output spectrums.*"
200 | ]
201 | },
202 | {
203 | "cell_type": "markdown",
204 | "metadata": {},
205 | "source": [
206 | "## Conclusion\n",
207 | "\n",
208 | "We have presented a straightforward application of colored inversion using only Python with the NumPy and SciPy libraries. This open-source workflow is documented at **github.com/seg**. It is called a 'robust' process in the literature, but it is somewhat sensitive to the chosen frequency range. There are also choices to be made about the window of application and the number of traces used to compute the seismic spectrum. Notwithstanding all this, the process is simple and fast, and yields informative images to interpreters."
209 | ]
210 | },
211 | {
212 | "cell_type": "markdown",
213 | "metadata": {},
214 | "source": [
215 | "## Acknowledgment\n",
216 | "Thanks to Matt Hall for useful comments and suggestions on the workflow and manuscript."
217 | ]
218 | },
219 | {
220 | "cell_type": "markdown",
221 | "metadata": {},
222 | "source": [
223 | "## References and further reading\n",
224 | "\n",
225 | "The F3 dataset is maintained by dGB Earth Sciences and TNO, and openly licensed CC-BY-SA. It can be obtained from The Open Seismic Repository opendtect.org/osr. \n",
226 | "\n",
227 | "For a recent comprehensive overview of seismic inversion methods, see Francis, A. (2014). A simple guide to seismic inversion. _GEOExPro_ **10** (2), 46–50.\n",
228 | "\n",
229 | "Lancaster, S. and D. Whitcombe (2000). Fast-track 'coloured' inversion. _SEG Expanded Abstracts, 2000_, p 1572–1575. DOI: 10.1190/1.18157111.\n",
230 | "\n",
231 | "Overeem, I, G. J. Weltje, C. Bishop-Kay, and S. B. Kroonenberg, (2001). The Late Cenozoic Eridanos delta system in the Southern North Sea Basin: a climate signal in sediment supply? Basin Research, 13, 293–312. DOI: 10.1046/j.1365-2117.2001.00151.x\n",
232 | "\n",
233 | "Sørensen, J.C., U. Gregersen, M. Breiner and O. Michelsen (1997). High frequency sequence stratigraphy of upper Cenozoic deposits. _Mar. Petrol. Geol._ **14**, 99–123. DOI: 10.1016/S0264-8172.\n",
234 | "\n",
235 | "Walden, A.T., and Hosken, J.W.J. (1985). An investigation of the spectral properties of primary reflection coefficients. _Geophysical Prospecting_ **33**, 400–435. DOI: 10.1111/j.1365-2478.1985.tb00443.x"
236 | ]
237 | },
238 | {
239 | "cell_type": "markdown",
240 | "metadata": {},
241 | "source": [
242 | "
\n",
243 | "\n",
244 | "© Martin Blouin & Erwan Gloaguen. Licensed CC-BY-SA. Article published by the Society of Exploration Geophysicists in _The Leading Edge_, October 2017."
245 | ]
246 | }
247 | ],
248 | "metadata": {
249 | "anaconda-cloud": {},
250 | "kernelspec": {
251 | "display_name": "Python [conda env:python3]",
252 | "language": "python",
253 | "name": "conda-env-python3-py"
254 | },
255 | "language_info": {
256 | "codemirror_mode": {
257 | "name": "ipython",
258 | "version": 3
259 | },
260 | "file_extension": ".py",
261 | "mimetype": "text/x-python",
262 | "name": "python",
263 | "nbconvert_exporter": "python",
264 | "pygments_lexer": "ipython3",
265 | "version": "3.5.2"
266 | }
267 | },
268 | "nbformat": 4,
269 | "nbformat_minor": 1
270 | }
271 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/Manuscript-rev1.md:
--------------------------------------------------------------------------------
1 |
2 | ### Geophysical Tutorial
3 |
4 | # Colored inversion
5 |
6 | Martin Blouin1 and Erwan Gloaguen2
7 |
8 | 1 GeoLEARN Solutions, Quebec City, Canada
9 | 2 INRS-ETE, Quebec City, Canada
10 |
11 | Corresponding author: martin.blouin@geolearn.ca
12 |
13 | Whether it is deterministic, band-limited or stochastic, seismic inversion can bear many names depending on the algorithm used to produce it. Broadly, inversion converts reflectivity data to physical properties of the earth, such as acoustic impedance, the product of seismic velocity and bulk density. This is useful because, while reflectivity informs us about boundaries, impedance can be converted to useful earth propertes such as porosity and fluid content via known petrophysical relationships.
14 |
15 | Lancaster and Whitcombe (2000) published a fast method for band-limited inversion of seismic data known as colored inversion (CI) that generated widespread interest among interpreters. Recognizing that the popular sparse-spike inversion process could be approximated by a single operator, yielding relative impedance via simple convolution with the reflectivity data, the authors showed that this operator can be derived from well logs. Like other inversions, CI can help remove the smearing effects of the seismic wavelet and enhance features such as thin beds and discontinuities. What's more, since CI is directly linked to seismic data, the relative impedance it produces can be used as a base for comparison with other inversion to see what kind of information is introduced by numerical constraints or the low-frequency model.
16 |
17 | In this tutorial, we follow the steps presented by Lancaster and Whitcombe in their 2000 expanded abstract to achieve the so-called "fast-track colored inversion". Using open-source algorithms, we describe all the steps to go from reflectivity data to inverted cubes:
18 |
19 | 1. Fit a function to the log spectrum(s).
20 | 2. Get a difference spectrum by substracting the seismic spectrum.
21 | 3. Convert the difference spectrum to an operator.
22 | 4. Convolve the operator with the stacked seismic.
23 | 5. As a QC step, check the residuals by comparing log and AI section spectrums.
24 |
25 | The idea of this tutorial is to achieve a colored inversion without any external software, just Python code with the NumPy and SciPy libraries. You can read and run the code for yourself from the repository at **github.com/seg/tutorials-2017**. The tutorial focus on presenting the whole workflow in the simplest fashion rather than trying to optimize parameters to recover interpretable features. Prior to running the workflow on your data, noise attenuation should be performed to ensure that the inversion process recovers frequencies associated only with the Earth.
26 |
27 | ## The dataset
28 |
29 | For our demonstration, we use one inline from the 1987 Dutch F3 volume (Figure 1), plus the acoustic impedance log from the F02-1 well. Good descriptions of the geological setting of this dataset can be found in Sorensen et al. (1997) and Overeem et al. (2001). We use the dip-steered median filter stacked dataset to get reduced noise on our input.
30 |
31 | 
32 | *Figure 1. F3 dip-steered median filtered stacked seismic data at inline 362 with well location and bounding horizons of the inverted region.*
33 |
34 | ## 1. Fit a function to the log spectrum
35 |
36 | Walden and Hosken (1984) observed that the reflectivity sequences in sedimentary basins display a logarithmic decay in amplitude as frequency increases. For the first step of our inversion, we look at the reflectivity spectrum and make sure it behaves as predicted. We load the F02-1 well, convert it to the time domain, and calculate the spectrum (Figure 2).
37 |
38 | ```python
39 | n_log = AI_f021.shape[0]
40 | k_log = np.arange(n_log-1)
41 | Fs_log = 1 / np.diff(time_f021/1000)
42 | T_log = n_log / Fs_log
43 | freq_log = k_log / T_log
44 | freq_log = freq_log[range(n_log//2)]
45 | spec_log = np.fft.fft(AI_f021) / n_log
46 | spec_log = spec_log[range(n_log//2)]
47 | ```
48 |
49 |
50 | *Figure 2. F02-1 well data. (a) AI log, (b) Calculated power spectrum.*
51 |
52 | We would like to simplify the spectrum, so we proceed to a regression. To make the process more robust, CI packages offer you the option of averaging this spectrum over all the available wells, but we can skip tht as we are working with only a single well. In order to proceed to a linear regression, we define two simple functions, one that serves as the linearization of the problem and one for the error function. I then use `scipy.optimize` to find the best fit, shown in Figure 3.
53 |
54 | ```python
55 | def linearize(p, x):
56 | return p[0] * x**p[1]
57 |
58 | def error(p, x, y):
59 | return np.log10(y) - np.log10(linearize(p, x))
60 |
61 | args = (freq_log[1:2000], np.abs(spec_log[1:2000]))
62 | qout, success = optimize.leastsq(error,
63 | (1e5, -0.8),
64 | args=args,
65 | maxfev=3000)
66 | ```
67 |
68 |
69 | *Figure 3. F02-1 well spectrum approximated by a linear function in log space.*
70 |
71 | ## 2. Compute the difference
72 |
73 | Now we have a continuous function that mathematically approximates the well log spectrum. The next major step of the workflow is to compute an operator that is representative of the difference between the log spectrum and the seismic spectrum.
74 |
75 | We first define some boundaries to our modelled spectrum in the frequency domain. This is a critical part that will have great influence on the end result. We define a simple function to generate a 50 points Hanning shaped taper at both end of the spectrum; the result is shown in Figure 4. Then we take seismic traces next to the well location, average them, and repeat the procedure we did on the well to get the spectrum. Figure 4 shows the resulting modelled spectrum. In this example, taper windows of 0–5 Hz and 100–120 Hz have been defined. It is important to note that our end result will be greatly influenced by this choice and care should be applied at this stage.
76 |
77 |
78 | *Figure 4. Comparison of well log, seismic and modelled frequency power spectrum.*
79 |
80 | After this step is completed, we simply substract the seismic spectrum from our modelled spectrum (Figure 5).
81 |
82 | ## 3. Convert to an operator
83 |
84 | Now, continuing with Lancaster & Whitcombe's methodology, we can derive an inversion operator. We move to the time domain with an inverse Fourier transform, then shift zero time to the center of the time window. Finally, we rotate the phase by taking the quadrature of the signal, represented by the imaginary component and shown in Figure 5.
85 |
86 | ```python
87 | gap = spec_log_model - spec_seismic_model
88 | operator = np.fft.ifft(gap)
89 | operator = np.fft.fftshift(operator)
90 | operator = operator.imag
91 | ```
92 |
93 | 
94 | *Figure 5. a) Resulting difference spectrum. b) Associated operator.*
95 |
96 | ## 4. Convolve operator with seismic
97 |
98 | Once the operator is calculated a simple trace by trace convolution with the reflectivity data is needed to perform colored inversion. NumPy's `apply_along_axis()` applies any function to all columns of an array, so we can pass it the convolution:
99 |
100 | ```python
101 | def convolve(t):
102 | return np.convolve(t, operator, mode='same')
103 |
104 | ci = np.apply_along_axis(convolve, axis=0, arr=seis)
105 | ```
106 |
107 | Since the relative impedance result contains no low frequencies, it does not inform us about trends, so it makes more sense to look at the result in a single formation. We will focus on an area of interest of about 300 ms in thickness between two horizons; Figure 6 presents the resulting relative impedance section scaled (0-1) in this area.
108 |
109 | 
110 | *Figure 6. Relative impedance result in a single stratigraphic unit.*
111 |
112 | ## 5. Check the residuals
113 |
114 | To make sure that we did a good job defining our operator, we now look at the spectrum from the relative impedance result at the well location to see if we achieved a good fit with the well log spectrum (Figure 7). It is to be noted that this fit was achieved with some arbitrary decisions, and the workflow could be iterated upon to try to minimize the difference between the two spectrums.
115 |
116 |
117 | *Figure 7. QC of the colored inversion workflow with comparison of input and output spectrums.*
118 |
119 | ## Conclusion
120 |
121 | We have presented a straightforward application of colored inversion using only Python with the NumPy and SciPy libraries. This open-source workflow is documented at **github.com/seg**. It is called a 'robust' process in the literature, but it is somewhat sensitive to the chosen frequency range. There are also choices to be made about the window of application and the number of traces used to compute the seismic spectrum. Notwithstanding all this, the process is simple and fast, and yields informative images to interpreters.
122 |
123 | ## Acknowledgment
124 | Thanks to Matt Hall for useful comments and suggestions on the workflow and manuscript.
125 |
126 | ## References and further reading
127 |
128 | The F3 dataset is maintained by dGB Earth Sciences and TNO, and openly licensed CC-BY-SA. It can be obtained from The Open Seismic Repository opendtect.org/osr.
129 |
130 | For a recent comprehensive overview of seismic inversion methods, see Francis, A. (2014). A simple guide to seismic inversion. _GEOExPro_ **10** (2), 46–50.
131 |
132 | Lancaster, S. and D. Whitcombe (2000). Fast-track 'coloured' inversion. _SEG Expanded Abstracts, 2000_, p 1572–1575. DOI: 10.1190/1.18157111.
133 |
134 | Overeem, I, G. J. Weltje, C. Bishop-Kay, and S. B. Kroonenberg, (2001). The Late Cenozoic Eridanos delta system in the Southern North Sea Basin: a climate signal in sediment supply? Basin Research, 13, 293–312. DOI: 10.1046/j.1365-2117.2001.00151.x
135 |
136 | Sørensen, J.C., U. Gregersen, M. Breiner and O. Michelsen (1997). High frequency sequence stratigraphy of upper Cenozoic deposits. _Mar. Petrol. Geol._ **14**, 99–123. DOI: 10.1016/S0264-8172.
137 |
138 | Walden, A.T., and Hosken, J.W.J. (1985). An investigation of the spectral properties of primary reflection coefficients. _Geophysical Prospecting_ **33**, 400–435. DOI: 10.1111/j.1365-2478.1985.tb00443.x
139 |
140 |
141 |
142 | © Martin Blouin & Erwan Gloaguen. Licensed CC-BY-SA. Article published by the Society of Exploration Geophysicists in _The Leading Edge_, October 2017.
143 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/Manuscript-rev1.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1710_Colored_inversion/Manuscript-rev1.pdf
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Checkshot/F02-1_TD.txt:
--------------------------------------------------------------------------------
1 | 30 0
2 | 553.6 0.544
3 | 612.9 0.607
4 | 683.31 0.675
5 | 716.65 0.712
6 | 748.49 0.748
7 | 795.18 0.794
8 | 927.28 0.932
9 | 1025.42 1.031
10 | 1048.84 1.051
11 | 1057.89 1.059
12 | 1068.74 1.068
13 | 1094.12 1.086
14 | 1134.73 1.117
15 | 1174.62 1.146
16 | 1197.08 1.165
17 | 1252.26 1.213
18 | 1285.09 1.242
19 | 1695 1.67
20 | 1872 1.861
21 | 2636 2.682
22 | 2735 2.788
23 | 2997.5 3.07
24 | 3028 3.103
25 | 3150 3.234
26 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Checkshot/F03-2_TD.txt:
--------------------------------------------------------------------------------
1 | 30 0
2 | 486.14 0.485
3 | 522.2 0.522
4 | 564.4 0.565
5 | 564.4 0.565
6 | 564.4 0.565
7 | 589.92 0.592
8 | 610.9 0.613
9 | 676.43 0.675
10 | 715.02 0.71
11 | 835.93 0.82
12 | 890.32 0.868
13 | 957.29 0.927
14 | 1036.94 0.995
15 | 1073.3 1.024
16 | 1111.79 1.056
17 | 1249.72 1.178
18 | 1647 1.569
19 | 1932 1.732
20 | 1885 1.698
21 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Checkshot/F03-4_TD.txt:
--------------------------------------------------------------------------------
1 | 34.1 0
2 | 479.74 0.473
3 | 510.52 0.504
4 | 547.75 0.543
5 | 547.75 0.543
6 | 547.75 0.543
7 | 569.66 0.565
8 | 611.39 0.61
9 | 664.95 0.662
10 | 697.11 0.692
11 | 856.08 0.84
12 | 907.88 0.886
13 | 946.5 0.921
14 | 1024.39 0.991
15 | 1071.12 1.032
16 | 1111.13 1.067
17 | 1200.93 1.15
18 | 1246 1.195
19 | 1359 1.304
20 | 1785 1.74
21 | 1858 1.773
22 | 1970 1.873
23 | 2375 2.234
24 | 2736 2.556
25 | 2806 2.618
26 | 2885 2.689
27 | 2923 2.722
28 | 2980 2.773
29 | 2277 2.147
30 | 2295 2.163
31 | 2317 2.182
32 | 2330 2.194
33 | 2362 2.222
34 | 3092 2.873
35 | 3111 2.89
36 | 3130 2.907
37 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Checkshot/F06-1_TD.txt:
--------------------------------------------------------------------------------
1 | 28.64 0
2 | 589.14 0.593
3 | 670.54 0.677
4 | 697.12 0.705
5 | 725.25 0.735
6 | 771.24 0.779
7 | 866.29 0.886
8 | 995.97 1.028
9 | 1015.24 1.042
10 | 1030.08 1.053
11 | 1049.63 1.066
12 | 1077.92 1.087
13 | 1114.22 1.113
14 | 1151.2 1.138
15 | 1170.07 1.152
16 | 1225.53 1.193
17 | 1261.34 1.221
18 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Checkshot/old/F02-01_DT_TVDSS.txt:
--------------------------------------------------------------------------------
1 | 0.0000 1.5693
2 | 5.0000 6.7446
3 | 10.0000 11.9199
4 | 15.0000 17.0952
5 | 20.0000 22.2688
6 | 25.0000 27.4367
7 | 30.0000 32.6002
8 | 35.0000 37.7594
9 | 40.0000 42.9142
10 | 45.0000 48.0646
11 | 50.0000 53.2106
12 | 55.0000 58.3523
13 | 60.0000 63.4895
14 | 65.0000 68.6225
15 | 70.0000 73.7512
16 | 75.0000 78.8756
17 | 80.0000 83.9956
18 | 85.0000 89.1113
19 | 90.0000 94.2228
20 | 95.0000 99.3300
21 | 100.0000 104.4330
22 | 105.0000 109.5318
23 | 110.0000 114.6263
24 | 115.0000 119.7167
25 | 120.0000 124.8030
26 | 125.0000 129.8852
27 | 130.0000 134.9633
28 | 135.0000 140.0373
29 | 140.0000 145.1073
30 | 145.0000 150.1732
31 | 150.0000 155.2352
32 | 155.0000 160.2933
33 | 160.0000 165.3475
34 | 165.0000 170.3979
35 | 170.0000 175.4444
36 | 175.0000 180.4872
37 | 180.0000 185.5262
38 | 185.0000 190.5614
39 | 190.0000 195.5931
40 | 195.0000 200.6211
41 | 200.0000 205.6456
42 | 205.0000 210.6665
43 | 210.0000 215.6839
44 | 215.0000 220.6979
45 | 220.0000 225.7086
46 | 225.0000 230.7159
47 | 230.0000 235.7200
48 | 235.0000 240.7209
49 | 240.0000 245.7186
50 | 245.0000 250.7133
51 | 250.0000 255.7049
52 | 255.0000 260.6936
53 | 260.0000 265.6794
54 | 265.0000 270.6625
55 | 270.0000 275.6430
56 | 275.0000 280.6219
57 | 280.0000 285.7909
58 | 285.0000 290.9544
59 | 290.0000 296.0587
60 | 295.0000 301.1543
61 | 300.0000 306.3679
62 | 305.0000 311.5817
63 | 310.0000 316.7501
64 | 315.0000 322.0240
65 | 320.0000 327.0888
66 | 325.0000 331.9058
67 | 330.0000 336.6132
68 | 335.0000 341.6273
69 | 340.0000 346.7336
70 | 345.0000 351.8943
71 | 350.0000 357.0338
72 | 355.0000 362.2628
73 | 360.0000 367.4357
74 | 365.0000 372.5035
75 | 370.0000 377.5240
76 | 375.0000 382.6488
77 | 380.0000 387.6788
78 | 385.0000 392.6787
79 | 390.0000 397.5515
80 | 395.0000 402.4355
81 | 400.0000 407.3208
82 | 405.0000 412.1421
83 | 410.0000 417.1695
84 | 415.0000 422.3351
85 | 420.0000 427.2973
86 | 425.0000 432.3746
87 | 430.0000 437.5463
88 | 435.0000 442.6939
89 | 440.0000 448.3935
90 | 445.0000 454.8667
91 | 450.0000 461.3164
92 | 455.0000 467.3005
93 | 460.0000 473.6690
94 | 465.0000 479.9659
95 | 470.0000 485.8828
96 | 475.0000 491.8073
97 | 480.0000 496.9168
98 | 485.0000 502.4533
99 | 490.0000 508.7158
100 | 495.0000 514.7606
101 | 500.0000 521.2961
102 | 505.0000 527.5464
103 | 510.0000 532.9225
104 | 515.0000 538.1974
105 | 520.0000 543.4250
106 | 525.0000 548.5608
107 | 530.0000 553.7289
108 | 535.0000 558.8745
109 | 540.0000 563.9904
110 | 545.0000 569.2132
111 | 550.0000 574.4297
112 | 555.0000 579.6058
113 | 560.0000 584.7880
114 | 565.0000 590.1985
115 | 570.0000 595.6724
116 | 575.0000 600.8460
117 | 580.0000 605.9503
118 | 585.0000 611.2341
119 | 590.0000 617.4673
120 | 595.0000 623.3607
121 | 600.0000 628.9509
122 | 605.0000 634.4163
123 | 610.0000 639.8458
124 | 615.0000 645.1522
125 | 620.0000 650.3259
126 | 625.0000 655.7402
127 | 630.0000 661.1167
128 | 635.0000 666.5533
129 | 640.0000 671.9069
130 | 645.0000 677.5324
131 | 650.0000 683.1723
132 | 655.0000 688.7369
133 | 660.0000 694.1372
134 | 665.0000 699.4899
135 | 670.0000 704.9326
136 | 675.0000 710.3369
137 | 680.0000 715.7010
138 | 685.0000 721.0247
139 | 690.0000 726.3078
140 | 695.0000 731.5513
141 | 700.0000 736.7561
142 | 705.0000 741.9243
143 | 710.0000 747.0576
144 | 715.0000 752.1594
145 | 720.0000 757.2327
146 | 725.0000 762.2819
147 | 730.0000 767.3157
148 | 735.0000 772.1570
149 | 740.0000 777.2246
150 | 745.0000 782.2892
151 | 750.0000 787.4374
152 | 755.0000 792.3779
153 | 760.0000 797.2328
154 | 765.0000 802.2368
155 | 770.0000 807.1028
156 | 775.0000 811.8249
157 | 780.0000 816.6517
158 | 785.0000 821.4706
159 | 790.0000 826.2439
160 | 795.0000 831.0312
161 | 800.0000 835.9064
162 | 805.0000 840.8229
163 | 810.0000 845.7599
164 | 815.0000 850.6462
165 | 820.0000 855.5662
166 | 825.0000 860.5922
167 | 830.0000 865.6591
168 | 835.0000 870.8209
169 | 840.0000 876.0394
170 | 845.0000 881.1747
171 | 850.0000 886.3044
172 | 855.0000 891.5181
173 | 860.0000 896.7371
174 | 865.0000 902.1722
175 | 870.0000 907.5478
176 | 875.0000 912.9082
177 | 880.0000 918.3641
178 | 885.0000 923.7615
179 | 890.0000 929.2050
180 | 895.0000 934.8146
181 | 900.0000 940.3600
182 | 905.0000 945.7040
183 | 910.0000 950.8691
184 | 915.0000 955.9855
185 | 920.0000 961.0647
186 | 925.0000 966.1097
187 | 930.0000 971.1809
188 | 935.0000 976.2264
189 | 940.0000 981.2970
190 | 945.0000 986.4794
191 | 950.0000 991.4511
192 | 955.0000 996.3140
193 | 960.0000 1001.1280
194 | 965.0000 1005.9221
195 | 970.0000 1010.6129
196 | 975.0000 1015.3808
197 | 980.0000 1020.1418
198 | 985.0000 1024.9678
199 | 990.0000 1029.8339
200 | 995.0000 1034.7992
201 | 1000.0000 1039.5905
202 | 1005.0000 1044.2755
203 | 1010.0000 1048.9050
204 | 1015.0000 1053.5675
205 | 1020.0000 1058.4611
206 | 1025.0000 1063.1523
207 | 1030.0000 1067.5273
208 | 1035.0000 1071.8932
209 | 1040.0000 1076.2446
210 | 1045.0000 1080.5338
211 | 1050.0000 1085.0050
212 | 1055.0000 1089.4221
213 | 1060.0000 1093.8378
214 | 1065.0000 1098.1969
215 | 1070.0000 1102.4406
216 | 1075.0000 1106.6917
217 | 1080.0000 1111.2634
218 | 1085.0000 1115.8511
219 | 1090.0000 1120.5273
220 | 1095.0000 1125.1541
221 | 1100.0000 1129.8008
222 | 1105.0000 1134.2377
223 | 1110.0000 1138.8629
224 | 1115.0000 1143.2517
225 | 1120.0000 1147.6932
226 | 1125.0000 1152.0956
227 | 1130.0000 1156.3511
228 | 1135.0000 1160.5359
229 | 1140.0000 1164.7145
230 | 1145.0000 1168.9241
231 | 1150.0000 1173.3168
232 | 1155.0000 1178.1100
233 | 1160.0000 1183.0277
234 | 1165.0000 1187.9961
235 | 1170.0000 1192.9734
236 | 1175.0000 1197.9343
237 | 1180.0000 1202.7209
238 | 1185.0000 1207.4142
239 | 1190.0000 1212.1249
240 | 1195.0000 1216.8076
241 | 1200.0000 1221.5468
242 | 1205.0000 1226.2428
243 | 1210.0000 1230.6787
244 | 1215.0000 1235.1642
245 | 1220.0000 1239.9465
246 | 1225.0000 1244.6127
247 | 1230.0000 1249.3763
248 | 1235.0000 1254.0872
249 | 1240.0000 1258.6816
250 | 1245.0000 1263.1249
251 | 1250.0000 1267.9153
252 | 1255.0000 1272.5305
253 | 1260.0000 1277.3551
254 | 1265.0000 1282.1812
255 | 1270.0000 1287.0017
256 | 1275.0000 1291.6458
257 | 1280.0000 1296.2733
258 | 1285.0000 1300.9282
259 | 1290.0000 1305.3965
260 | 1295.0000 1309.7922
261 | 1300.0000 1314.2418
262 | 1305.0000 1318.9594
263 | 1310.0000 1323.6771
264 | 1315.0000 1328.4979
265 | 1320.0000 1333.3411
266 | 1325.0000 1338.1205
267 | 1330.0000 1342.9670
268 | 1335.0000 1347.8702
269 | 1340.0000 1352.7264
270 | 1345.0000 1357.7721
271 | 1350.0000 1362.6486
272 | 1355.0000 1367.4730
273 | 1360.0000 1372.2939
274 | 1365.0000 1376.9248
275 | 1370.0000 1381.4410
276 | 1375.0000 1386.1155
277 | 1380.0000 1390.9457
278 | 1385.0000 1395.8120
279 | 1390.0000 1400.7174
280 | 1395.0000 1405.6453
281 | 1400.0000 1410.7570
282 | 1405.0000 1416.0060
283 | 1410.0000 1421.2494
284 | 1415.0000 1426.4888
285 | 1420.0000 1431.7351
286 | 1425.0000 1436.9813
287 | 1430.0000 1442.2386
288 | 1435.0000 1447.5239
289 | 1440.0000 1452.8230
290 | 1445.0000 1458.1316
291 | 1450.0000 1463.4398
292 | 1455.0000 1468.7047
293 | 1460.0000 1474.0304
294 | 1465.0000 1479.3660
295 | 1470.0000 1484.6908
296 | 1475.0000 1490.0685
297 | 1480.0000 1495.4463
298 | 1485.0000 1500.8241
299 | 1490.0000 1506.2019
300 | 1495.0000 1511.5797
301 | 1500.0000 1516.9575
302 | 1505.0000 1522.3353
303 | 1510.0000 1527.7131
304 | 1515.0000 1533.0908
305 | 1520.0000 1538.4686
306 | 1525.0000 1543.8464
307 | 1530.0000 1549.2242
308 | 1535.0000 1554.6021
309 | 1540.0000 1559.9799
310 | 1545.0000 1565.3577
311 | 1550.0000 1570.7354
312 | 1555.0000 1576.1132
313 | 1560.0000 1581.4910
314 | 1565.0000 1586.8688
315 | 1570.0000 1592.2466
316 | 1575.0000 1597.6244
317 | 1580.0000 1603.0022
318 | 1585.0000 1608.3799
319 | 1590.0000 1613.7577
320 | 1595.0000 1619.1355
321 | 1600.0000 1624.5133
322 | 1605.0000 1629.8911
323 | 1610.0000 1635.2689
324 | 1615.0000 1640.6467
325 | 1620.0000 1646.0245
326 | 1625.0000 1651.4022
327 | 1630.0000 1656.7800
328 | 1635.0000 1662.1578
329 | 1640.0000 1667.5356
330 | 1645.0000 1672.9135
331 | 1650.0000 1678.2913
332 | 1655.0000 1683.6691
333 | 1660.0000 1689.0468
334 | 1665.0000 1694.4246
335 | 1670.0000 1699.8024
336 | 1675.0000 1705.1802
337 | 1680.0000 1710.5580
338 | 1685.0000 1715.9358
339 | 1690.0000 1721.3136
340 | 1695.0000 1726.6914
341 | 1700.0000 1732.0691
342 | 1705.0000 1737.4469
343 | 1710.0000 1742.8247
344 | 1715.0000 1748.2025
345 | 1720.0000 1753.5803
346 | 1725.0000 1758.9581
347 | 1730.0000 1764.3359
348 | 1735.0000 1769.7136
349 | 1740.0000 1775.0914
350 | 1745.0000 1780.4692
351 | 1750.0000 1785.8470
352 | 1755.0000 1791.2249
353 | 1760.0000 1796.6027
354 | 1765.0000 1801.9805
355 | 1770.0000 1807.3582
356 | 1775.0000 1812.7360
357 | 1780.0000 1818.1138
358 | 1785.0000 1823.4916
359 | 1790.0000 1828.8694
360 | 1795.0000 1834.2472
361 | 1800.0000 1839.6250
362 | 1805.0000 1845.0028
363 | 1810.0000 1850.3805
364 | 1815.0000 1855.7583
365 | 1820.0000 1861.1361
366 | 1825.0000 1866.5139
367 | 1830.0000 1871.8917
368 | 1835.0000 1877.2695
369 | 1840.0000 1882.6473
370 | 1845.0000 1888.0250
371 | 1850.0000 1893.4028
372 | 1855.0000 1898.7806
373 | 1860.0000 1904.1584
374 | 1865.0000 1909.5363
375 | 1870.0000 1914.9141
376 | 1875.0000 1920.2919
377 | 1880.0000 1925.6697
378 | 1885.0000 1931.0474
379 | 1890.0000 1936.4252
380 | 1895.0000 1941.8030
381 | 1900.0000 1947.1808
382 | 1905.0000 1952.5586
383 | 1910.0000 1957.9364
384 | 1915.0000 1963.3142
385 | 1920.0000 1968.6919
386 | 1925.0000 1974.0697
387 | 1930.0000 1979.4475
388 | 1935.0000 1984.8253
389 | 1940.0000 1990.2031
390 | 1945.0000 1995.5809
391 | 1950.0000 2000.9587
392 | 1955.0000 2006.3364
393 | 1960.0000 2011.7142
394 | 1965.0000 2017.0920
395 | 1970.0000 2022.4698
396 | 1975.0000 2027.8477
397 | 1980.0000 2033.2255
398 | 1985.0000 2038.6033
399 | 1990.0000 2043.9811
400 | 1995.0000 2049.3589
401 | 2000.0000 2054.7366
402 | 2005.0000 2060.1145
403 | 2010.0000 2065.4922
404 | 2015.0000 2070.8699
405 | 2020.0000 2076.2478
406 | 2025.0000 2081.6255
407 | 2030.0000 2087.0034
408 | 2035.0000 2092.3811
409 | 2040.0000 2097.7590
410 | 2045.0000 2103.1367
411 | 2050.0000 2108.5144
412 | 2055.0000 2113.8923
413 | 2060.0000 2119.2700
414 | 2065.0000 2124.6479
415 | 2070.0000 2130.0256
416 | 2075.0000 2135.4036
417 | 2080.0000 2140.7812
418 | 2085.0000 2146.1589
419 | 2090.0000 2151.5369
420 | 2095.0000 2156.9146
421 | 2100.0000 2162.2925
422 | 2105.0000 2167.6702
423 | 2110.0000 2173.0481
424 | 2115.0000 2178.4258
425 | 2120.0000 2183.8037
426 | 2125.0000 2189.1814
427 | 2130.0000 2194.5591
428 | 2135.0000 2199.9370
429 | 2140.0000 2205.3147
430 | 2145.0000 2210.6926
431 | 2150.0000 2216.0703
432 | 2155.0000 2221.4482
433 | 2160.0000 2226.8259
434 | 2165.0000 2232.2036
435 | 2170.0000 2237.5815
436 | 2175.0000 2242.9592
437 | 2180.0000 2248.3372
438 | 2185.0000 2253.7148
439 | 2190.0000 2259.0928
440 | 2195.0000 2264.4705
441 | 2200.0000 2269.8481
442 | 2205.0000 2275.2261
443 | 2210.0000 2280.6038
444 | 2215.0000 2285.9817
445 | 2220.0000 2291.3594
446 | 2225.0000 2296.7373
447 | 2230.0000 2302.1150
448 | 2235.0000 2307.4927
449 | 2240.0000 2312.8706
450 | 2245.0000 2318.2483
451 | 2250.0000 2323.6262
452 | 2255.0000 2329.0039
453 | 2260.0000 2334.3818
454 | 2265.0000 2339.7595
455 | 2270.0000 2345.1372
456 | 2275.0000 2350.5151
457 | 2280.0000 2355.8928
458 | 2285.0000 2361.2708
459 | 2290.0000 2366.6484
460 | 2295.0000 2372.0264
461 | 2300.0000 2377.4041
462 | 2305.0000 2382.7820
463 | 2310.0000 2388.1597
464 | 2315.0000 2393.5374
465 | 2320.0000 2398.9153
466 | 2325.0000 2404.2930
467 | 2330.0000 2409.6709
468 | 2335.0000 2415.0486
469 | 2340.0000 2420.4265
470 | 2345.0000 2425.8042
471 | 2350.0000 2431.1819
472 | 2355.0000 2436.5598
473 | 2360.0000 2441.9375
474 | 2365.0000 2447.3154
475 | 2370.0000 2452.6931
476 | 2375.0000 2458.0710
477 | 2380.0000 2463.4487
478 | 2385.0000 2468.8264
479 | 2390.0000 2474.2043
480 | 2395.0000 2479.5820
481 | 2400.0000 2484.9600
482 | 2405.0000 2490.3376
483 | 2410.0000 2495.7156
484 | 2415.0000 2501.0933
485 | 2420.0000 2506.4709
486 | 2425.0000 2511.8489
487 | 2430.0000 2517.2266
488 | 2435.0000 2522.6045
489 | 2440.0000 2527.9822
490 | 2445.0000 2533.3601
491 | 2450.0000 2538.7378
492 | 2455.0000 2544.1155
493 | 2460.0000 2549.4934
494 | 2465.0000 2554.8711
495 | 2470.0000 2560.2490
496 | 2475.0000 2565.6267
497 | 2480.0000 2571.0046
498 | 2485.0000 2576.3823
499 | 2490.0000 2581.7603
500 | 2495.0000 2587.1379
501 | 2500.0000 2592.5156
502 | 2505.0000 2597.8936
503 | 2510.0000 2603.2712
504 | 2515.0000 2608.6492
505 | 2520.0000 2614.0269
506 | 2525.0000 2619.4048
507 | 2530.0000 2624.7825
508 | 2535.0000 2630.1602
509 | 2540.0000 2635.5381
510 | 2545.0000 2640.9158
511 | 2550.0000 2646.2937
512 | 2555.0000 2651.6714
513 | 2560.0000 2657.0493
514 | 2565.0000 2662.4270
515 | 2570.0000 2667.8047
516 | 2575.0000 2673.1826
517 | 2580.0000 2678.5603
518 | 2585.0000 2683.9382
519 | 2590.0000 2689.3159
520 | 2595.0000 2694.6938
521 | 2600.0000 2700.0715
522 | 2605.0000 2705.4492
523 | 2610.0000 2710.8271
524 | 2615.0000 2716.2048
525 | 2620.0000 2721.5828
526 | 2625.0000 2726.9604
527 | 2630.0000 2732.3384
528 | 2635.0000 2737.7161
529 | 2640.0000 2743.0938
530 | 2645.0000 2748.4717
531 | 2650.0000 2753.8494
532 | 2655.0000 2759.2273
533 | 2660.0000 2764.6050
534 | 2665.0000 2769.9829
535 | 2670.0000 2775.3606
536 | 2675.0000 2780.7385
537 | 2680.0000 2786.1162
538 | 2685.0000 2791.4939
539 | 2690.0000 2796.8718
540 | 2695.0000 2802.2495
541 | 2700.0000 2807.6274
542 | 2705.0000 2813.0051
543 | 2710.0000 2818.3831
544 | 2715.0000 2823.7607
545 | 2720.0000 2829.1384
546 | 2725.0000 2834.5164
547 | 2730.0000 2839.8940
548 | 2735.0000 2845.2720
549 | 2740.0000 2850.6497
550 | 2745.0000 2856.0276
551 | 2750.0000 2861.4053
552 | 2755.0000 2866.7830
553 | 2760.0000 2872.1609
554 | 2765.0000 2877.5386
555 | 2770.0000 2882.9165
556 | 2775.0000 2888.2942
557 | 2780.0000 2893.6721
558 | 2785.0000 2899.0498
559 | 2790.0000 2904.4275
560 | 2795.0000 2909.8054
561 | 2800.0000 2915.1831
562 | 2805.0000 2920.5610
563 | 2810.0000 2925.9387
564 | 2815.0000 2931.3167
565 | 2820.0000 2936.6943
566 | 2825.0000 2942.0720
567 | 2830.0000 2947.4500
568 | 2835.0000 2952.8276
569 | 2840.0000 2958.2056
570 | 2845.0000 2963.5833
571 | 2850.0000 2968.9612
572 | 2855.0000 2974.3389
573 | 2860.0000 2979.7168
574 | 2865.0000 2985.0945
575 | 2870.0000 2990.4722
576 | 2875.0000 2995.8501
577 | 2880.0000 3001.2278
578 | 2885.0000 3006.6057
579 | 2890.0000 3011.9834
580 | 2895.0000 3017.3613
581 | 2900.0000 3022.7390
582 | 2905.0000 3028.1167
583 | 2910.0000 3033.4946
584 | 2915.0000 3038.8723
585 | 2920.0000 3044.2502
586 | 2925.0000 3049.6279
587 | 2930.0000 3055.0059
588 | 2935.0000 3060.3835
589 | 2940.0000 3065.7612
590 | 2945.0000 3071.1392
591 | 2950.0000 3076.5168
592 | 2955.0000 3081.8948
593 | 2960.0000 3087.2725
594 | 2965.0000 3092.6504
595 | 2970.0000 3098.0281
596 | 2975.0000 3103.4058
597 | 2980.0000 3108.7837
598 | 2985.0000 3114.1614
599 | 2990.0000 3119.5393
600 | 2995.0000 3124.9170
601 | 3000.0000 3130.2949
602 | 3005.0000 3135.6726
603 | 3010.0000 3141.0503
604 | 3015.0000 3146.4282
605 | 3020.0000 3151.8059
606 | 3025.0000 3157.1838
607 | 3030.0000 3162.5615
608 | 3035.0000 3167.9395
609 | 3040.0000 3173.3171
610 | 3045.0000 3178.6951
611 | 3050.0000 3184.0728
612 | 3055.0000 3189.4504
613 | 3060.0000 3194.8284
614 | 3065.0000 3200.2061
615 | 3070.0000 3205.5840
616 | 3075.0000 3210.9617
617 | 3080.0000 3216.3396
618 | 3085.0000 3221.7173
619 | 3090.0000 3227.0950
620 | 3095.0000 3232.4729
621 | 3100.0000 3237.8506
622 | 3105.0000 3243.2285
623 | 3110.0000 3248.6062
624 | 3115.0000 3253.9841
625 | 3120.0000 3259.3618
626 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Checkshot/old/F03-02_DT_TVDSS.txt:
--------------------------------------------------------------------------------
1 | 5.0000 10.6665
2 | 10.0000 16.0127
3 | 15.0000 21.3598
4 | 20.0000 26.7077
5 | 25.0000 32.0565
6 | 30.0000 37.4061
7 | 35.0000 42.7566
8 | 40.0000 48.1080
9 | 45.0000 53.4602
10 | 50.0000 58.8133
11 | 55.0000 64.1672
12 | 60.0000 69.5220
13 | 65.0000 74.8777
14 | 70.0000 80.2342
15 | 75.0000 85.5916
16 | 80.0000 90.9498
17 | 85.0000 96.3089
18 | 90.0000 101.6688
19 | 95.0000 107.0296
20 | 100.0000 112.3913
21 | 105.0000 117.7538
22 | 110.0000 123.1172
23 | 115.0000 128.4814
24 | 120.0000 133.8465
25 | 125.0000 139.2124
26 | 130.0000 144.5792
27 | 135.0000 149.9469
28 | 140.0000 155.3155
29 | 145.0000 160.6849
30 | 150.0000 166.0551
31 | 155.0000 171.4262
32 | 160.0000 176.7971
33 | 165.0000 182.1656
34 | 170.0000 187.5317
35 | 175.0000 192.8952
36 | 180.0000 198.2563
37 | 185.0000 203.6150
38 | 190.0000 208.9712
39 | 195.0000 214.3250
40 | 200.0000 219.6763
41 | 205.0000 225.0251
42 | 210.0000 230.3715
43 | 215.0000 235.7155
44 | 220.0000 241.0569
45 | 225.0000 246.3959
46 | 230.0000 251.7325
47 | 235.0000 257.0666
48 | 240.0000 262.3982
49 | 245.0000 267.7273
50 | 250.0000 273.0540
51 | 255.0000 278.3782
52 | 260.0000 283.7000
53 | 265.0000 289.0187
54 | 270.0000 294.3326
55 | 275.0000 299.6398
56 | 280.0000 304.9393
57 | 285.0000 310.2299
58 | 290.0000 315.5113
59 | 295.0000 320.7833
60 | 300.0000 326.0462
61 | 305.0000 331.3007
62 | 310.0000 336.4038
63 | 315.0000 341.7392
64 | 320.0000 347.1318
65 | 325.0000 352.4927
66 | 330.0000 357.8242
67 | 335.0000 363.2684
68 | 340.0000 368.7144
69 | 345.0000 373.8518
70 | 350.0000 378.9980
71 | 355.0000 384.1518
72 | 360.0000 389.3002
73 | 365.0000 394.5362
74 | 370.0000 399.7924
75 | 375.0000 405.0877
76 | 380.0000 410.3020
77 | 385.0000 415.4877
78 | 390.0000 420.7270
79 | 395.0000 425.8778
80 | 400.0000 431.1005
81 | 405.0000 436.4914
82 | 410.0000 442.0398
83 | 415.0000 447.2001
84 | 420.0000 452.5736
85 | 425.0000 457.9373
86 | 430.0000 463.2255
87 | 435.0000 468.4672
88 | 440.0000 473.7085
89 | 445.0000 478.8564
90 | 450.0000 484.3554
91 | 455.0000 489.7114
92 | 460.0000 495.0900
93 | 465.0000 500.2679
94 | 470.0000 505.7216
95 | 475.0000 511.0352
96 | 480.0000 516.5426
97 | 485.0000 521.6301
98 | 490.0000 526.7021
99 | 495.0000 531.8866
100 | 500.0000 537.0953
101 | 505.0000 542.3698
102 | 510.0000 547.5249
103 | 515.0000 552.6747
104 | 520.0000 557.7842
105 | 525.0000 562.9212
106 | 530.0000 568.0142
107 | 535.0000 573.4252
108 | 540.0000 578.6849
109 | 545.0000 583.9183
110 | 550.0000 588.8671
111 | 555.0000 593.7744
112 | 560.0000 598.8202
113 | 565.0000 603.7982
114 | 570.0000 608.6711
115 | 575.0000 613.4700
116 | 580.0000 618.1775
117 | 585.0000 622.8458
118 | 590.0000 627.8202
119 | 595.0000 632.6038
120 | 600.0000 637.3532
121 | 605.0000 642.2560
122 | 610.0000 647.0792
123 | 615.0000 651.8849
124 | 620.0000 656.4709
125 | 625.0000 661.4651
126 | 630.0000 666.4500
127 | 635.0000 671.3237
128 | 640.0000 676.0493
129 | 645.0000 680.6368
130 | 650.0000 685.2061
131 | 655.0000 689.7853
132 | 660.0000 694.3665
133 | 665.0000 698.9219
134 | 670.0000 703.4897
135 | 675.0000 708.0532
136 | 680.0000 712.6238
137 | 685.0000 717.1887
138 | 690.0000 721.8574
139 | 695.0000 726.4444
140 | 700.0000 731.0486
141 | 705.0000 735.6151
142 | 710.0000 740.1749
143 | 715.0000 744.6613
144 | 720.0000 749.1736
145 | 725.0000 753.6479
146 | 730.0000 758.1613
147 | 735.0000 762.6664
148 | 740.0000 767.1571
149 | 745.0000 771.6155
150 | 750.0000 776.0690
151 | 755.0000 780.5554
152 | 760.0000 784.9576
153 | 765.0000 789.3706
154 | 770.0000 793.8207
155 | 775.0000 798.2235
156 | 780.0000 802.5985
157 | 785.0000 807.0452
158 | 790.0000 811.5986
159 | 795.0000 816.1315
160 | 800.0000 820.6708
161 | 805.0000 825.4247
162 | 810.0000 829.9084
163 | 815.0000 834.4048
164 | 820.0000 838.8868
165 | 825.0000 843.3252
166 | 830.0000 847.7159
167 | 835.0000 852.0572
168 | 840.0000 856.4194
169 | 845.0000 860.7497
170 | 850.0000 865.0942
171 | 855.0000 869.4719
172 | 860.0000 873.8730
173 | 865.0000 878.2344
174 | 870.0000 882.6484
175 | 875.0000 886.9258
176 | 880.0000 891.1768
177 | 885.0000 895.6766
178 | 890.0000 900.0587
179 | 895.0000 904.4628
180 | 900.0000 908.8795
181 | 905.0000 913.1924
182 | 910.0000 917.4708
183 | 915.0000 921.8040
184 | 920.0000 926.1316
185 | 925.0000 930.4598
186 | 930.0000 934.5590
187 | 935.0000 938.9531
188 | 940.0000 943.3019
189 | 945.0000 947.6578
190 | 950.0000 951.8327
191 | 955.0000 956.0091
192 | 960.0000 960.1924
193 | 965.0000 964.5593
194 | 970.0000 968.8223
195 | 975.0000 973.0490
196 | 980.0000 977.2084
197 | 985.0000 981.2780
198 | 990.0000 985.4131
199 | 995.0000 989.5695
200 | 1000.0000 993.7441
201 | 1005.0000 997.9160
202 | 1010.0000 1002.0303
203 | 1015.0000 1006.0267
204 | 1020.0000 1010.1868
205 | 1025.0000 1014.2138
206 | 1030.0000 1018.2580
207 | 1035.0000 1022.3202
208 | 1040.0000 1026.3611
209 | 1045.0000 1030.4133
210 | 1050.0000 1034.4534
211 | 1055.0000 1038.5160
212 | 1060.0000 1042.5972
213 | 1065.0000 1046.7277
214 | 1070.0000 1050.8821
215 | 1075.0000 1055.1719
216 | 1080.0000 1059.5814
217 | 1085.0000 1063.9196
218 | 1090.0000 1068.2483
219 | 1095.0000 1072.5817
220 | 1100.0000 1077.0072
221 | 1105.0000 1081.4669
222 | 1110.0000 1085.8892
223 | 1115.0000 1090.2629
224 | 1120.0000 1094.7067
225 | 1125.0000 1099.0072
226 | 1130.0000 1103.4073
227 | 1135.0000 1107.7427
228 | 1140.0000 1112.1052
229 | 1145.0000 1116.4570
230 | 1150.0000 1120.6787
231 | 1155.0000 1125.0272
232 | 1160.0000 1129.3153
233 | 1165.0000 1133.6680
234 | 1170.0000 1138.0762
235 | 1175.0000 1142.4486
236 | 1180.0000 1146.8098
237 | 1185.0000 1151.1802
238 | 1190.0000 1155.7155
239 | 1195.0000 1160.2806
240 | 1200.0000 1164.9656
241 | 1205.0000 1169.5800
242 | 1210.0000 1174.2399
243 | 1215.0000 1178.8717
244 | 1220.0000 1183.5253
245 | 1225.0000 1188.4211
246 | 1230.0000 1193.3351
247 | 1235.0000 1198.2729
248 | 1240.0000 1203.2181
249 | 1245.0000 1208.1809
250 | 1250.0000 1213.0654
251 | 1255.0000 1218.0074
252 | 1260.0000 1222.4832
253 | 1265.0000 1227.1768
254 | 1270.0000 1232.0515
255 | 1275.0000 1237.1786
256 | 1280.0000 1242.3342
257 | 1285.0000 1247.2843
258 | 1290.0000 1252.0198
259 | 1295.0000 1256.6278
260 | 1300.0000 1261.3204
261 | 1305.0000 1266.2419
262 | 1310.0000 1271.1407
263 | 1315.0000 1276.0618
264 | 1320.0000 1281.0776
265 | 1325.0000 1286.1624
266 | 1330.0000 1291.1694
267 | 1335.0000 1296.1116
268 | 1340.0000 1300.9355
269 | 1345.0000 1305.9980
270 | 1350.0000 1311.1744
271 | 1355.0000 1316.2648
272 | 1360.0000 1321.3718
273 | 1365.0000 1326.4562
274 | 1370.0000 1331.4630
275 | 1375.0000 1336.3726
276 | 1380.0000 1341.2854
277 | 1385.0000 1346.2212
278 | 1390.0000 1351.2701
279 | 1395.0000 1356.3397
280 | 1400.0000 1361.2681
281 | 1405.0000 1366.0559
282 | 1410.0000 1371.0608
283 | 1415.0000 1376.0164
284 | 1420.0000 1380.9420
285 | 1425.0000 1385.9536
286 | 1430.0000 1390.9906
287 | 1435.0000 1396.0582
288 | 1440.0000 1401.0961
289 | 1445.0000 1406.1495
290 | 1450.0000 1411.2045
291 | 1455.0000 1416.2576
292 | 1460.0000 1421.2755
293 | 1465.0000 1426.2950
294 | 1470.0000 1431.3794
295 | 1475.0000 1436.4559
296 | 1480.0000 1441.4879
297 | 1485.0000 1446.5922
298 | 1490.0000 1451.6495
299 | 1495.0000 1456.7537
300 | 1500.0000 1461.8954
301 | 1505.0000 1466.8859
302 | 1510.0000 1471.8649
303 | 1515.0000 1476.7843
304 | 1520.0000 1481.6709
305 | 1525.0000 1486.7209
306 | 1530.0000 1491.7493
307 | 1535.0000 1496.8367
308 | 1540.0000 1501.9022
309 | 1545.0000 1507.0533
310 | 1550.0000 1512.2366
311 | 1555.0000 1517.3574
312 | 1560.0000 1522.1333
313 | 1565.0000 1526.8502
314 | 1570.0000 1531.5410
315 | 1575.0000 1536.1926
316 | 1580.0000 1540.8074
317 | 1585.0000 1545.4867
318 | 1590.0000 1549.9166
319 | 1595.0000 1553.9139
320 | 1600.0000 1558.4243
321 | 1605.0000 1562.9957
322 | 1610.0000 1567.5083
323 | 1615.0000 1571.9861
324 | 1620.0000 1575.5653
325 | 1625.0000 1578.8036
326 | 1630.0000 1582.0282
327 | 1635.0000 1585.3857
328 | 1640.0000 1588.4880
329 | 1645.0000 1591.4830
330 | 1650.0000 1594.5084
331 | 1655.0000 1597.4985
332 | 1660.0000 1600.6223
333 | 1665.0000 1603.6875
334 | 1670.0000 1606.6664
335 | 1675.0000 1609.4766
336 | 1680.0000 1612.1042
337 | 1685.0000 1614.9067
338 | 1690.0000 1617.7953
339 | 1695.0000 1620.5901
340 | 1700.0000 1623.4506
341 | 1705.0000 1626.4799
342 | 1710.0000 1629.2147
343 | 1715.0000 1631.9434
344 | 1720.0000 1634.6167
345 | 1725.0000 1637.2930
346 | 1730.0000 1640.1104
347 | 1735.0000 1642.7504
348 | 1740.0000 1645.2238
349 | 1745.0000 1647.5978
350 | 1750.0000 1650.1774
351 | 1755.0000 1652.7396
352 | 1760.0000 1655.3767
353 | 1765.0000 1658.0974
354 | 1770.0000 1660.8826
355 | 1775.0000 1663.5319
356 | 1780.0000 1666.0389
357 | 1785.0000 1668.3726
358 | 1790.0000 1670.7776
359 | 1795.0000 1673.2308
360 | 1800.0000 1675.6073
361 | 1805.0000 1677.9990
362 | 1810.0000 1680.3254
363 | 1815.0000 1682.6956
364 | 1820.0000 1684.9426
365 | 1825.0000 1687.2338
366 | 1830.0000 1689.6921
367 | 1835.0000 1692.2566
368 | 1840.0000 1694.8728
369 | 1845.0000 1697.3513
370 | 1850.0000 1699.7131
371 | 1855.0000 1702.2638
372 | 1860.0000 1705.0997
373 | 1865.0000 1708.2694
374 | 1870.0000 1711.1594
375 | 1875.0000 1714.1639
376 | 1880.0000 1717.7467
377 | 1885.0000 1721.9561
378 | 1890.0000 1726.1484
379 | 1895.0000 1730.3038
380 | 1900.0000 1734.5576
381 | 1905.0000 1737.9324
382 | 1910.0000 1740.6771
383 | 1915.0000 1742.8253
384 | 1920.0000 1745.8619
385 | 1925.0000 1748.7498
386 | 1930.0000 1751.2201
387 | 1935.0000 1753.8539
388 | 1940.0000 1756.0306
389 | 1945.0000 1758.1813
390 | 1950.0000 1760.4825
391 | 1955.0000 1762.8105
392 | 1960.0000 1765.1569
393 | 1965.0000 1767.5575
394 | 1970.0000 1770.0751
395 | 1975.0000 1772.5215
396 | 1980.0000 1774.7732
397 | 1985.0000 1777.0278
398 | 1990.0000 1779.2656
399 | 1995.0000 1781.5071
400 | 2000.0000 1783.7975
401 | 2005.0000 1786.0496
402 | 2010.0000 1788.4672
403 | 2015.0000 1790.9216
404 | 2020.0000 1793.1732
405 | 2025.0000 1795.4238
406 | 2030.0000 1797.6719
407 | 2035.0000 1799.9144
408 | 2040.0000 1802.1580
409 | 2045.0000 1804.4233
410 | 2050.0000 1806.8016
411 | 2055.0000 1809.0905
412 | 2060.0000 1811.3521
413 | 2065.0000 1813.6018
414 | 2070.0000 1815.8503
415 | 2075.0000 1818.2900
416 | 2080.0000 1820.6951
417 | 2085.0000 1823.0052
418 | 2090.0000 1825.2537
419 | 2095.0000 1827.5071
420 | 2100.0000 1829.7552
421 | 2105.0000 1832.0055
422 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Checkshot/old/F03-04_DT_TVDSS.txt:
--------------------------------------------------------------------------------
1 | 5.0000 46.1600
2 | 10.0000 51.2390
3 | 15.0000 56.3139
4 | 20.0000 61.3847
5 | 25.0000 66.4514
6 | 30.0000 71.5140
7 | 35.0000 76.5725
8 | 40.0000 81.6269
9 | 45.0000 86.6772
10 | 50.0000 91.7234
11 | 55.0000 96.7654
12 | 60.0000 101.8034
13 | 65.0000 106.8373
14 | 70.0000 111.8671
15 | 75.0000 116.8928
16 | 80.0000 121.9144
17 | 85.0000 126.9319
18 | 90.0000 131.9453
19 | 95.0000 136.9546
20 | 100.0000 141.9598
21 | 105.0000 146.9608
22 | 110.0000 151.9578
23 | 115.0000 156.9507
24 | 120.0000 161.9394
25 | 125.0000 166.9241
26 | 130.0000 171.9046
27 | 135.0000 176.8811
28 | 140.0000 181.8534
29 | 145.0000 186.8217
30 | 150.0000 191.7859
31 | 155.0000 196.7460
32 | 160.0000 201.7021
33 | 165.0000 206.6540
34 | 170.0000 211.6018
35 | 175.0000 216.5455
36 | 180.0000 221.4851
37 | 185.0000 226.4206
38 | 190.0000 231.3520
39 | 195.0000 236.2793
40 | 200.0000 241.2025
41 | 205.0000 246.1216
42 | 210.0000 251.0365
43 | 215.0000 255.9474
44 | 220.0000 260.8542
45 | 225.0000 265.7568
46 | 230.0000 270.6553
47 | 235.0000 275.5498
48 | 240.0000 280.4401
49 | 245.0000 285.3264
50 | 250.0000 290.2085
51 | 255.0000 295.0865
52 | 260.0000 299.9604
53 | 265.0000 304.8302
54 | 270.0000 309.6959
55 | 275.0000 314.5575
56 | 280.0000 319.4152
57 | 285.0000 324.2686
58 | 290.0000 329.1181
59 | 295.0000 333.9633
60 | 300.0000 338.8045
61 | 305.0000 343.6416
62 | 310.0000 348.4746
63 | 315.0000 353.3034
64 | 320.0000 358.1282
65 | 325.0000 362.9489
66 | 330.0000 367.7654
67 | 335.0000 372.5779
68 | 340.0000 377.3862
69 | 345.0000 382.1904
70 | 350.0000 386.9905
71 | 355.0000 391.7866
72 | 360.0000 396.5785
73 | 365.0000 401.3665
74 | 370.0000 406.1539
75 | 375.0000 410.9451
76 | 380.0000 415.7438
77 | 385.0000 420.5529
78 | 390.0000 425.3744
79 | 395.0000 430.2097
80 | 400.0000 435.0591
81 | 405.0000 439.9225
82 | 410.0000 444.7983
83 | 415.0000 449.6845
84 | 420.0000 454.5758
85 | 425.0000 459.4649
86 | 430.0000 464.3468
87 | 435.0000 469.2178
88 | 440.0000 474.0764
89 | 445.0000 478.9224
90 | 450.0000 483.7580
91 | 455.0000 488.5866
92 | 460.0000 493.4145
93 | 465.0000 498.2486
94 | 470.0000 503.0979
95 | 475.0000 508.1355
96 | 480.0000 513.1302
97 | 485.0000 517.9079
98 | 490.0000 522.8738
99 | 495.0000 527.8456
100 | 500.0000 532.7296
101 | 505.0000 537.6256
102 | 510.0000 542.6343
103 | 515.0000 547.7975
104 | 520.0000 552.9611
105 | 525.0000 557.8547
106 | 530.0000 562.6443
107 | 535.0000 567.3788
108 | 540.0000 572.2707
109 | 545.0000 577.3958
110 | 550.0000 582.4882
111 | 555.0000 587.5419
112 | 560.0000 592.5702
113 | 565.0000 597.5919
114 | 570.0000 602.5750
115 | 575.0000 607.4347
116 | 580.0000 612.1652
117 | 585.0000 616.9280
118 | 590.0000 621.6055
119 | 595.0000 626.2064
120 | 600.0000 631.0679
121 | 605.0000 635.7694
122 | 610.0000 640.5082
123 | 615.0000 645.5308
124 | 620.0000 650.5694
125 | 625.0000 655.5598
126 | 630.0000 660.5243
127 | 635.0000 665.4388
128 | 640.0000 670.0458
129 | 645.0000 674.6180
130 | 650.0000 679.1404
131 | 655.0000 683.6398
132 | 660.0000 688.1407
133 | 665.0000 692.6367
134 | 670.0000 697.1391
135 | 675.0000 701.6320
136 | 680.0000 706.1785
137 | 685.0000 710.7062
138 | 690.0000 715.1812
139 | 695.0000 719.6467
140 | 700.0000 724.0939
141 | 705.0000 728.5027
142 | 710.0000 732.9340
143 | 715.0000 737.4808
144 | 720.0000 742.0606
145 | 725.0000 746.4767
146 | 730.0000 750.8491
147 | 735.0000 755.4189
148 | 740.0000 759.8888
149 | 745.0000 764.3024
150 | 750.0000 768.8074
151 | 755.0000 773.4977
152 | 760.0000 777.8980
153 | 765.0000 782.4614
154 | 770.0000 786.9849
155 | 775.0000 791.6675
156 | 780.0000 796.0865
157 | 785.0000 800.5784
158 | 790.0000 805.1741
159 | 795.0000 809.6964
160 | 800.0000 814.1127
161 | 805.0000 818.5654
162 | 810.0000 823.2127
163 | 815.0000 827.6493
164 | 820.0000 832.1170
165 | 825.0000 836.5906
166 | 830.0000 841.0291
167 | 835.0000 845.4479
168 | 840.0000 849.8442
169 | 845.0000 854.2089
170 | 850.0000 858.6185
171 | 855.0000 862.9410
172 | 860.0000 867.2919
173 | 865.0000 871.5728
174 | 870.0000 875.8796
175 | 875.0000 880.2347
176 | 880.0000 884.6063
177 | 885.0000 889.0017
178 | 890.0000 893.3839
179 | 895.0000 898.0389
180 | 900.0000 902.7109
181 | 905.0000 907.0512
182 | 910.0000 911.4532
183 | 915.0000 915.8934
184 | 920.0000 920.2917
185 | 925.0000 924.6463
186 | 930.0000 929.0602
187 | 935.0000 933.6473
188 | 940.0000 938.0244
189 | 945.0000 942.2745
190 | 950.0000 946.8299
191 | 955.0000 951.3541
192 | 960.0000 955.8884
193 | 965.0000 960.3399
194 | 970.0000 964.7277
195 | 975.0000 968.9831
196 | 980.0000 973.3511
197 | 985.0000 977.6838
198 | 990.0000 982.0684
199 | 995.0000 986.4277
200 | 1000.0000 990.7397
201 | 1005.0000 995.0005
202 | 1010.0000 999.3898
203 | 1015.0000 1003.6432
204 | 1020.0000 1007.8883
205 | 1025.0000 1012.1544
206 | 1030.0000 1016.3904
207 | 1035.0000 1020.6524
208 | 1040.0000 1024.8315
209 | 1045.0000 1028.9771
210 | 1050.0000 1033.1176
211 | 1055.0000 1037.2488
212 | 1060.0000 1041.5260
213 | 1065.0000 1045.8418
214 | 1070.0000 1050.1588
215 | 1075.0000 1054.6759
216 | 1080.0000 1059.2689
217 | 1085.0000 1063.8612
218 | 1090.0000 1068.5013
219 | 1095.0000 1073.0450
220 | 1100.0000 1077.6644
221 | 1105.0000 1082.3796
222 | 1110.0000 1087.0553
223 | 1115.0000 1091.7373
224 | 1120.0000 1096.3086
225 | 1125.0000 1100.9480
226 | 1130.0000 1105.6168
227 | 1135.0000 1110.2261
228 | 1140.0000 1114.8898
229 | 1145.0000 1119.5304
230 | 1150.0000 1124.1930
231 | 1155.0000 1128.7802
232 | 1160.0000 1133.5112
233 | 1165.0000 1138.1013
234 | 1170.0000 1142.7430
235 | 1175.0000 1147.5239
236 | 1180.0000 1152.3779
237 | 1185.0000 1157.3414
238 | 1190.0000 1162.3489
239 | 1195.0000 1167.1860
240 | 1200.0000 1172.1595
241 | 1205.0000 1177.2993
242 | 1210.0000 1182.3766
243 | 1215.0000 1187.2821
244 | 1220.0000 1192.2902
245 | 1225.0000 1197.3971
246 | 1230.0000 1202.4580
247 | 1235.0000 1207.4022
248 | 1240.0000 1212.6428
249 | 1245.0000 1217.8160
250 | 1250.0000 1223.1063
251 | 1255.0000 1228.4463
252 | 1260.0000 1233.6848
253 | 1265.0000 1238.7815
254 | 1270.0000 1243.9062
255 | 1275.0000 1248.7073
256 | 1280.0000 1253.8448
257 | 1285.0000 1258.8846
258 | 1290.0000 1263.8806
259 | 1295.0000 1268.9568
260 | 1300.0000 1273.9918
261 | 1305.0000 1278.6500
262 | 1310.0000 1283.4156
263 | 1315.0000 1288.4358
264 | 1320.0000 1293.2428
265 | 1325.0000 1298.0187
266 | 1330.0000 1302.8705
267 | 1335.0000 1307.6034
268 | 1340.0000 1312.2368
269 | 1345.0000 1316.8567
270 | 1350.0000 1321.6216
271 | 1355.0000 1326.4056
272 | 1360.0000 1331.1633
273 | 1365.0000 1336.1921
274 | 1370.0000 1341.3322
275 | 1375.0000 1346.5707
276 | 1380.0000 1351.8833
277 | 1385.0000 1357.2130
278 | 1390.0000 1362.4825
279 | 1395.0000 1367.7246
280 | 1400.0000 1373.0231
281 | 1405.0000 1378.1157
282 | 1410.0000 1383.3776
283 | 1415.0000 1388.7053
284 | 1420.0000 1394.0588
285 | 1425.0000 1399.4800
286 | 1430.0000 1404.8712
287 | 1435.0000 1410.2527
288 | 1440.0000 1415.6547
289 | 1445.0000 1421.0519
290 | 1450.0000 1426.3605
291 | 1455.0000 1431.6588
292 | 1460.0000 1437.0117
293 | 1465.0000 1442.4640
294 | 1470.0000 1447.9041
295 | 1475.0000 1453.3870
296 | 1480.0000 1458.8750
297 | 1485.0000 1464.3002
298 | 1490.0000 1469.7372
299 | 1495.0000 1475.1620
300 | 1500.0000 1480.5990
301 | 1505.0000 1486.0449
302 | 1510.0000 1491.4535
303 | 1515.0000 1496.8242
304 | 1520.0000 1502.1135
305 | 1525.0000 1507.4719
306 | 1530.0000 1512.8718
307 | 1535.0000 1518.3604
308 | 1540.0000 1523.8864
309 | 1545.0000 1529.2603
310 | 1550.0000 1534.7449
311 | 1555.0000 1540.1005
312 | 1560.0000 1545.3842
313 | 1565.0000 1550.7977
314 | 1570.0000 1556.1548
315 | 1575.0000 1561.5851
316 | 1580.0000 1567.2203
317 | 1585.0000 1572.8000
318 | 1590.0000 1578.2035
319 | 1595.0000 1583.7378
320 | 1600.0000 1589.1812
321 | 1605.0000 1594.6584
322 | 1610.0000 1600.2023
323 | 1615.0000 1605.6908
324 | 1620.0000 1611.0221
325 | 1625.0000 1616.3739
326 | 1630.0000 1621.7698
327 | 1635.0000 1627.2474
328 | 1640.0000 1632.7556
329 | 1645.0000 1638.2847
330 | 1650.0000 1643.6016
331 | 1655.0000 1649.0411
332 | 1660.0000 1654.2478
333 | 1665.0000 1659.6401
334 | 1670.0000 1665.1154
335 | 1675.0000 1670.3052
336 | 1680.0000 1675.5157
337 | 1685.0000 1680.7770
338 | 1690.0000 1685.9166
339 | 1695.0000 1690.8776
340 | 1700.0000 1695.9227
341 | 1705.0000 1700.9642
342 | 1710.0000 1705.9706
343 | 1715.0000 1711.0786
344 | 1720.0000 1715.9819
345 | 1725.0000 1721.0570
346 | 1730.0000 1726.4960
347 | 1735.0000 1731.9752
348 | 1740.0000 1737.4241
349 | 1745.0000 1742.8256
350 | 1750.0000 1747.6567
351 | 1755.0000 1752.2557
352 | 1760.0000 1757.2561
353 | 1765.0000 1761.8092
354 | 1770.0000 1766.4255
355 | 1775.0000 1770.9564
356 | 1780.0000 1775.5139
357 | 1785.0000 1780.0732
358 | 1790.0000 1784.6161
359 | 1795.0000 1789.2103
360 | 1800.0000 1793.1385
361 | 1805.0000 1797.1477
362 | 1810.0000 1801.4888
363 | 1815.0000 1805.7891
364 | 1820.0000 1810.2172
365 | 1825.0000 1814.7227
366 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Checkshot/old/F06-01_DT_TVDSS.txt:
--------------------------------------------------------------------------------
1 | 5.0000 25.2428
2 | 10.0000 30.4442
3 | 15.0000 35.6425
4 | 20.0000 40.8377
5 | 25.0000 46.0296
6 | 30.0000 51.2184
7 | 35.0000 56.4040
8 | 40.0000 61.5865
9 | 45.0000 66.7657
10 | 50.0000 71.9418
11 | 55.0000 77.1147
12 | 60.0000 82.2845
13 | 65.0000 87.4510
14 | 70.0000 92.6144
15 | 75.0000 97.7746
16 | 80.0000 102.9317
17 | 85.0000 108.0855
18 | 90.0000 113.2362
19 | 95.0000 118.3837
20 | 100.0000 123.5281
21 | 105.0000 128.6693
22 | 110.0000 133.8073
23 | 115.0000 138.9421
24 | 120.0000 144.0737
25 | 125.0000 149.2022
26 | 130.0000 154.3275
27 | 135.0000 159.4496
28 | 140.0000 164.5686
29 | 145.0000 169.6843
30 | 150.0000 174.7970
31 | 155.0000 179.9064
32 | 160.0000 185.0126
33 | 165.0000 190.1157
34 | 170.0000 195.2156
35 | 175.0000 200.3123
36 | 180.0000 205.4059
37 | 185.0000 210.4963
38 | 190.0000 215.5835
39 | 195.0000 220.6675
40 | 200.0000 225.7484
41 | 205.0000 230.8261
42 | 210.0000 235.9006
43 | 215.0000 240.9719
44 | 220.0000 246.0401
45 | 225.0000 251.1051
46 | 230.0000 256.1669
47 | 235.0000 261.2256
48 | 240.0000 266.2810
49 | 245.0000 271.3333
50 | 250.0000 276.3824
51 | 255.0000 281.4284
52 | 260.0000 286.4711
53 | 265.0000 291.5114
54 | 270.0000 296.5497
55 | 275.0000 301.5863
56 | 280.0000 306.6209
57 | 285.0000 311.6538
58 | 290.0000 316.6848
59 | 295.0000 321.7139
60 | 300.0000 326.7412
61 | 305.0000 331.7670
62 | 310.0000 336.7916
63 | 315.0000 341.8151
64 | 320.0000 346.8375
65 | 325.0000 351.8587
66 | 330.0000 356.8788
67 | 335.0000 361.8977
68 | 340.0000 366.9156
69 | 345.0000 371.9322
70 | 350.0000 376.9477
71 | 355.0000 381.9621
72 | 360.0000 386.9753
73 | 365.0000 391.9875
74 | 370.0000 396.9984
75 | 375.0000 402.0083
76 | 380.0000 407.0169
77 | 385.0000 412.0245
78 | 390.0000 417.0309
79 | 395.0000 422.0363
80 | 400.0000 427.0404
81 | 405.0000 432.0435
82 | 410.0000 437.0454
83 | 415.0000 442.0462
84 | 420.0000 447.0454
85 | 425.0000 452.0414
86 | 430.0000 457.0324
87 | 435.0000 462.0168
88 | 440.0000 466.9933
89 | 445.0000 471.9619
90 | 450.0000 476.9272
91 | 455.0000 481.8892
92 | 460.0000 486.8475
93 | 465.0000 491.8016
94 | 470.0000 496.7513
95 | 475.0000 501.6969
96 | 480.0000 506.6386
97 | 485.0000 511.5770
98 | 490.0000 516.5127
99 | 495.0000 521.4467
100 | 500.0000 526.3798
101 | 505.0000 531.3124
102 | 510.0000 536.2455
103 | 515.0000 541.1799
104 | 520.0000 546.1157
105 | 525.0000 551.0536
106 | 530.0000 555.9941
107 | 535.0000 560.9374
108 | 540.0000 565.8842
109 | 545.0000 570.8342
110 | 550.0000 575.7880
111 | 555.0000 580.7468
112 | 560.0000 585.7113
113 | 565.0000 590.7104
114 | 570.0000 595.9333
115 | 575.0000 601.1693
116 | 580.0000 606.3431
117 | 585.0000 611.4926
118 | 590.0000 616.6161
119 | 595.0000 621.7064
120 | 600.0000 626.8568
121 | 605.0000 632.0630
122 | 610.0000 637.2823
123 | 615.0000 642.4448
124 | 620.0000 647.6932
125 | 625.0000 652.8746
126 | 630.0000 658.0916
127 | 635.0000 663.3705
128 | 640.0000 668.6538
129 | 645.0000 674.1414
130 | 650.0000 679.6878
131 | 655.0000 685.2593
132 | 660.0000 690.9334
133 | 665.0000 696.5659
134 | 670.0000 702.2085
135 | 675.0000 707.8386
136 | 680.0000 713.4758
137 | 685.0000 719.1104
138 | 690.0000 724.7185
139 | 695.0000 730.2487
140 | 700.0000 735.7154
141 | 705.0000 741.0880
142 | 710.0000 746.4183
143 | 715.0000 751.6700
144 | 720.0000 756.9517
145 | 725.0000 762.2713
146 | 730.0000 767.5782
147 | 735.0000 772.8658
148 | 740.0000 778.2236
149 | 745.0000 783.6905
150 | 750.0000 789.4499
151 | 755.0000 795.2040
152 | 760.0000 800.6381
153 | 765.0000 805.9484
154 | 770.0000 811.3727
155 | 775.0000 816.7535
156 | 780.0000 822.1291
157 | 785.0000 827.5585
158 | 790.0000 832.9770
159 | 795.0000 838.3873
160 | 800.0000 843.8524
161 | 805.0000 849.2927
162 | 810.0000 854.7690
163 | 815.0000 860.2786
164 | 820.0000 865.8142
165 | 825.0000 871.3110
166 | 830.0000 876.7202
167 | 835.0000 882.1139
168 | 840.0000 887.5025
169 | 845.0000 892.8827
170 | 850.0000 898.2939
171 | 855.0000 903.7853
172 | 860.0000 909.1961
173 | 865.0000 914.6075
174 | 870.0000 919.9157
175 | 875.0000 925.2026
176 | 880.0000 930.5076
177 | 885.0000 935.8939
178 | 890.0000 941.2042
179 | 895.0000 946.5291
180 | 900.0000 951.7538
181 | 905.0000 956.9619
182 | 910.0000 962.0514
183 | 915.0000 967.1750
184 | 920.0000 972.3144
185 | 925.0000 977.4146
186 | 930.0000 982.4619
187 | 935.0000 987.4675
188 | 940.0000 992.4724
189 | 945.0000 997.4435
190 | 950.0000 1002.3759
191 | 955.0000 1007.3403
192 | 960.0000 1012.2938
193 | 965.0000 1017.2623
194 | 970.0000 1022.2275
195 | 975.0000 1027.1571
196 | 980.0000 1032.0697
197 | 985.0000 1036.9854
198 | 990.0000 1041.8489
199 | 995.0000 1046.6824
200 | 1000.0000 1051.4667
201 | 1005.0000 1056.3506
202 | 1010.0000 1061.1528
203 | 1015.0000 1065.8005
204 | 1020.0000 1070.4341
205 | 1025.0000 1075.0521
206 | 1030.0000 1079.6493
207 | 1035.0000 1084.3124
208 | 1040.0000 1088.9910
209 | 1045.0000 1093.5969
210 | 1050.0000 1098.1688
211 | 1055.0000 1102.5968
212 | 1060.0000 1107.2008
213 | 1065.0000 1111.9224
214 | 1070.0000 1116.6273
215 | 1075.0000 1121.3224
216 | 1080.0000 1125.9780
217 | 1085.0000 1130.4946
218 | 1090.0000 1134.9525
219 | 1095.0000 1139.2948
220 | 1100.0000 1143.6068
221 | 1105.0000 1147.8590
222 | 1110.0000 1152.0858
223 | 1115.0000 1156.3015
224 | 1120.0000 1160.5557
225 | 1125.0000 1164.7893
226 | 1130.0000 1169.0151
227 | 1135.0000 1173.4308
228 | 1140.0000 1177.9753
229 | 1145.0000 1182.5369
230 | 1150.0000 1187.0437
231 | 1155.0000 1191.4441
232 | 1160.0000 1195.8179
233 | 1165.0000 1200.0990
234 | 1170.0000 1204.4509
235 | 1175.0000 1208.7150
236 | 1180.0000 1213.0391
237 | 1185.0000 1217.2042
238 | 1190.0000 1221.5574
239 | 1195.0000 1225.9548
240 | 1200.0000 1230.5211
241 | 1205.0000 1235.1975
242 | 1210.0000 1239.8759
243 | 1215.0000 1244.4529
244 | 1220.0000 1249.1448
245 | 1225.0000 1253.7888
246 | 1230.0000 1258.4906
247 | 1235.0000 1263.2007
248 | 1240.0000 1268.0404
249 | 1245.0000 1272.7784
250 | 1250.0000 1277.6034
251 | 1255.0000 1282.4568
252 | 1260.0000 1287.0986
253 | 1265.0000 1291.5509
254 | 1270.0000 1296.0042
255 | 1275.0000 1300.7234
256 | 1280.0000 1305.4319
257 | 1285.0000 1310.2263
258 | 1290.0000 1315.0233
259 | 1295.0000 1319.8217
260 | 1300.0000 1324.5554
261 | 1305.0000 1329.2490
262 | 1310.0000 1333.9424
263 | 1315.0000 1338.5336
264 | 1320.0000 1343.3225
265 | 1325.0000 1348.0450
266 | 1330.0000 1352.8397
267 | 1335.0000 1357.5455
268 | 1340.0000 1362.2977
269 | 1345.0000 1367.1852
270 | 1350.0000 1372.0345
271 | 1355.0000 1376.9767
272 | 1360.0000 1381.8427
273 | 1365.0000 1386.7792
274 | 1370.0000 1391.4001
275 | 1375.0000 1395.9320
276 | 1380.0000 1400.4574
277 | 1385.0000 1405.0793
278 | 1390.0000 1409.4491
279 | 1395.0000 1413.9301
280 | 1400.0000 1418.4255
281 | 1405.0000 1422.9816
282 | 1410.0000 1427.5436
283 | 1415.0000 1432.3197
284 | 1420.0000 1437.1516
285 | 1425.0000 1442.0002
286 | 1430.0000 1446.8427
287 | 1435.0000 1451.7699
288 | 1440.0000 1456.6714
289 | 1445.0000 1461.5703
290 | 1450.0000 1466.5566
291 | 1455.0000 1471.6053
292 | 1460.0000 1476.5674
293 | 1465.0000 1481.5560
294 | 1470.0000 1486.4709
295 | 1475.0000 1491.3856
296 | 1480.0000 1496.2455
297 | 1485.0000 1500.9717
298 | 1490.0000 1505.7260
299 | 1495.0000 1510.5081
300 | 1500.0000 1515.2151
301 | 1505.0000 1520.0339
302 | 1510.0000 1524.7113
303 | 1515.0000 1529.5240
304 | 1520.0000 1534.4321
305 | 1525.0000 1539.3430
306 | 1530.0000 1544.2153
307 | 1535.0000 1548.9869
308 | 1540.0000 1553.7786
309 | 1545.0000 1558.7535
310 | 1550.0000 1563.6654
311 | 1555.0000 1568.5916
312 | 1560.0000 1573.3680
313 | 1565.0000 1578.1492
314 | 1570.0000 1582.8960
315 | 1575.0000 1587.6500
316 | 1580.0000 1592.3597
317 | 1585.0000 1596.8326
318 | 1590.0000 1600.3737
319 | 1595.0000 1603.0103
320 | 1600.0000 1605.6104
321 | 1605.0000 1608.4037
322 | 1610.0000 1610.9803
323 | 1615.0000 1613.6116
324 | 1620.0000 1616.8929
325 | 1625.0000 1620.5444
326 | 1630.0000 1624.1216
327 | 1635.0000 1627.8804
328 | 1640.0000 1631.7360
329 | 1645.0000 1635.5459
330 | 1650.0000 1639.4854
331 | 1655.0000 1643.3633
332 | 1660.0000 1647.1638
333 | 1665.0000 1651.0076
334 | 1670.0000 1655.0463
335 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Tops/F02-1_markers.txt:
--------------------------------------------------------------------------------
1 | 30 Seasurface
2 | 553.6 MFS11
3 | 612.9 FS11
4 | 683.31 MFS10
5 | 716.65 MFS9
6 | 748.49 MFS8
7 | 795.18 FS8
8 | 927.28 FS7
9 | 1025.42 Truncation 1
10 | 1048.84 Lower Low Sonic
11 | 1057.89 FS6
12 | 1068.74 MFS4
13 | 1094.12 FS4
14 | 1134.73 FS 3
15 | 1174.62 FS2
16 | 1197.08 MFS 2
17 | 1252.26 FS1
18 | 1285.09 NMRF (Mid_Mio_Unc)
19 | 1695 CKGR
20 | 1872 SGKI
21 | 2636 SLCU
22 | 2735 SLCMU
23 | 2997.5 SLCMS
24 | 3028 SLCML
25 | 3150 SLCL
26 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Tops/F03-2_markers.txt:
--------------------------------------------------------------------------------
1 | 30 Seasurface
2 | 486.14 MFS11
3 | 522.2 FS11
4 | 564.4 MFS10
5 | 564.4 MFS9
6 | 564.4 MFS8
7 | 589.92 FS8
8 | 610.9 FS7
9 | 676.43 Truncation 1
10 | 715.02 Top Foresets
11 | 835.93 FS6
12 | 890.32 MFS4
13 | 957.29 FS4
14 | 1036.94 FS 3
15 | 1073.3 FS2
16 | 1111.79 MFS 2
17 | 1249.72 NMRF (Mid_Mio_Unc)
18 | 1647 CK
19 | 1932 ZE
20 | 1885 KN
21 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Tops/F03-4_markers.txt:
--------------------------------------------------------------------------------
1 | 30 Seasurface
2 | 479.74 MFS11
3 | 510.52 FS11
4 | 547.75 MFS10
5 | 547.75 MFS9
6 | 547.75 MFS8
7 | 569.66 FS8
8 | 611.39 FS7
9 | 664.95 Truncation 1
10 | 697.11 Top Foresets
11 | 856.08 FS6
12 | 907.88 MFS4
13 | 946.5 FS4
14 | 1024.39 FS 3
15 | 1071.12 FS2
16 | 1111.13 MFS 2
17 | 1200.93 FS1
18 | 1246 NMRF (Mid_Mio_Unc)
19 | 1359 NLFF
20 | 1785 NLLFC (Base Tertiary)
21 | 1858 CKEK
22 | 1970 CKGR
23 | 2375 SGKI
24 | 2736 SLCU
25 | 2806 SLCMU
26 | 2885 SLCMS
27 | 2923 SLCML
28 | 2980 SLCL
29 | 2277 KNGL
30 | 2295 KNNCK
31 | 2317 KNNCM
32 | 2330 SGKIC
33 | 2362 SGGS
34 | 3092 RNKPU
35 | 3111 RNKPD
36 | 3130 RNKPR
37 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Tops/F06-1_markers.txt:
--------------------------------------------------------------------------------
1 | 589.14 FS11
2 | 670.54 MFS10
3 | 697.12 MFS9
4 | 725.25 MFS8
5 | 771.24 FS8
6 | 866.29 FS7
7 | 995.97 Truncation 1
8 | 1015.24 Lower Low Sonic
9 | 1030.08 FS6
10 | 1049.63 MFS4
11 | 1077.92 FS4
12 | 1114.22 FS 3
13 | 1151.2 FS2
14 | 1170.07 MFS 2
15 | 1225.53 FS1
16 | 1261.34 NMRF (Mid_Mio_Unc)
17 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Tops/F3-well-markers.xls:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1710_Colored_inversion/data/All_wells_RawData/Tops/F3-well-markers.xls
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Track/F02-1.track:
--------------------------------------------------------------------------------
1 | 606554 6080126 -30 0
2 | 606554 6080126 1665 1695
3 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Track/F03-2.track:
--------------------------------------------------------------------------------
1 | 619101 6089491 -30 0
2 | 619101 6089491 2110 2140
3 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Track/F03-4.track:
--------------------------------------------------------------------------------
1 | 623256 6082586 -30 0
2 | 623256 6082586 1870 1900
3 |
--------------------------------------------------------------------------------
/1710_Colored_inversion/data/All_wells_RawData/Track/F06-1.track:
--------------------------------------------------------------------------------
1 | 607903 6077213 -28.64 0.00
2 | 607903 6077213 1672.36 1701.00
3 |
--------------------------------------------------------------------------------
/1712_FWI_forward_modeling/Figures/Figure1_composed.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1712_FWI_forward_modeling/Figures/Figure1_composed.pdf
--------------------------------------------------------------------------------
/1712_FWI_forward_modeling/Figures/Figure2.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1712_FWI_forward_modeling/Figures/Figure2.pdf
--------------------------------------------------------------------------------
/1712_FWI_forward_modeling/Figures/Figure2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1712_FWI_forward_modeling/Figures/Figure2.png
--------------------------------------------------------------------------------
/1712_FWI_forward_modeling/Figures/Figure3.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1712_FWI_forward_modeling/Figures/Figure3.pdf
--------------------------------------------------------------------------------
/1712_FWI_forward_modeling/Figures/Figure3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1712_FWI_forward_modeling/Figures/Figure3.png
--------------------------------------------------------------------------------
/1712_FWI_forward_modeling/Figures/animation.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1712_FWI_forward_modeling/Figures/animation.gif
--------------------------------------------------------------------------------
/1712_FWI_forward_modeling/Figures/ccode-crop.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1712_FWI_forward_modeling/Figures/ccode-crop.png
--------------------------------------------------------------------------------
/1712_FWI_forward_modeling/Figures/setup.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1712_FWI_forward_modeling/Figures/setup.png
--------------------------------------------------------------------------------
/1712_FWI_forward_modeling/Figures/shotrecord_marmou.pdf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1712_FWI_forward_modeling/Figures/shotrecord_marmou.pdf
--------------------------------------------------------------------------------
/1712_FWI_forward_modeling/Figures/shotrecord_marmou.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1712_FWI_forward_modeling/Figures/shotrecord_marmou.png
--------------------------------------------------------------------------------
/1712_FWI_forward_modeling/Initial/bib_tuto.bib:
--------------------------------------------------------------------------------
1 |
2 | @article{Meurer17,
3 | Abstract = {
4 | SymPy is an open source computer algebra system written in pure Python. It is built with a focus on extensibility and ease of use, through both interactive and programmatic applications. These characteristics have led SymPy to become a popular symbolic library for the scientific Python ecosystem. This paper presents the architecture of SymPy, a description of its features, and a discussion of select submodules. The supplementary material provide additional examples and further outline details of the architecture and features of SymPy.
5 | },
6 | Author = {Meurer, Aaron and Smith, Christopher P. and Paprocki, Mateusz and {\v C}ert{\'\i}k, Ond{\v r}ej and Kirpichev, Sergey B. and Rocklin, Matthew and Kumar, AMiT and Ivanov, Sergiu and Moore, Jason K. and Singh, Sartaj and Rathnayake, Thilina and Vig, Sean and Granger, Brian E. and Muller, Richard P. and Bonazzi, Francesco and Gupta, Harsh and Vats, Shivam and Johansson, Fredrik and Pedregosa, Fabian and Curry, Matthew J. and Terrel, Andy R. and Rou{\v c}ka, {\v S}t{\v e}p{\'a}n and Saboo, Ashutosh and Fernando, Isuru and Kulal, Sumith and Cimrman, Robert and Scopatz, Anthony},
7 | Doi = {10.7717/peerj-cs.103},
8 | Issn = {2376-5992},
9 | Journal = {PeerJ Computer Science},
10 | Keywords = {Python, Computer algebra system, Symbolics},
11 | Month = jan,
12 | Pages = {e103},
13 | Title = {SymPy: symbolic computing in Python},
14 | Url = {https://doi.org/10.7717/peerj-cs.103},
15 | Volume = 3,
16 | Year = 2017,
17 | Bdsk-Url-1 = {https://doi.org/10.7717/peerj-cs.103},
18 | Bdsk-Url-2 = {http://dx.doi.org/10.7717/peerj-cs.103}}
19 |
20 |
21 | @article{Tomo,
22 | title = "Seismic imaging: From classical to adjoint tomography",
23 | journal = "Tectonophysics",
24 | volume = "566-567",
25 | number = "Supplement C",
26 | pages = "31 - 66",
27 | year = "2012",
28 | issn = "0040-1951",
29 | doi = "https://doi.org/10.1016/j.tecto.2012.07.006",
30 | url = "http://www.sciencedirect.com/science/article/pii/S004019511200409X",
31 | author = "Q. Liu and Y.J. Gu",
32 | keywords = "Seismic tomography, Sensitivity kernels, Inverse problem, Adjoint methods, Adjoint tomography, Full waveform inversion"
33 | }
34 |
35 | @article{Tarantola,
36 | Author = {Albert Tarantola},
37 | Doi = {10.1190/1.1441754},
38 | Eprint = {https://doi.org/10.1190/1.1441754},
39 | Journal = {GEOPHYSICS},
40 | Number = {8},
41 | Pages = {1259-1266},
42 | Title = {Inversion of seismic reflection data in the acoustic approximation},
43 | Url = {https://doi.org/10.1190/1.1441754},
44 | Volume = {49},
45 | Year = {1984},
46 | Bdsk-Url-1 = {https://doi.org/10.1190/1.1441754},
47 | Bdsk-Url-2 = {http://dx.doi.org/10.1190/1.1441754}}
48 |
49 | @article{Cerjan,
50 | author = {Charles Cerjan and Dan Kosloff and Ronnie Kosloff and Moshe Reshef},
51 | title = {A nonreflecting boundary condition for discrete acoustic and elastic wave equations},
52 | journal = {GEOPHYSICS},
53 | volume = {50},
54 | number = {4},
55 | pages = {705-708},
56 | year = {1985},
57 | doi = {10.1190/1.1441945},
58 |
59 | URL = {
60 | https://doi.org/10.1190/1.1441945
61 |
62 | },
63 | eprint = {
64 | https://doi.org/10.1190/1.1441945
65 |
66 | }
67 |
68 | }
69 |
70 | @conference{lange2016dtg,
71 | title = {Devito: {Towards} a generic finite difference {DSL} using symbolic python},
72 | booktitle = {6th Workshop on Python for High-Performance and Scientific Computing},
73 | year = {2016},
74 | note = {(PyHPC, Utah)},
75 | month = {11},
76 | pages = {67-75},
77 | abstract = {Domain specific languages (DSL) have been used in a variety of fields to express complex scientific problems in a concise manner and provide automated performance optimization for a range of computational architectures. As such DSLs provide a powerful mechanism to speed up scientific Python computation that goes beyond traditional vectorization and pre-compilation approaches, while allowing domain scientists to build applications within the comforts of the Python software ecosystem. In this paper we present Devito, a new finite difference DSL that provides optimized stencil computation from high-level problem specifications based on symbolic Python expressions. We demonstrate Devito{\textquoteright}s symbolic API and performance advantages over traditional Python acceleration methods before highlighting its use in the scientific context of seismic inversion problems.},
78 | keywords = {acoustic, finite differences, HPC, inversion, Modelling, python, software optimization},
79 | doi = {10.1109/PyHPC.2016.9},
80 | url = {https://www.slim.eos.ubc.ca/Publications/Public/Conferences/PyHPC/2016/lange2016dtg/lange2016dtg.pdf},
81 | url2 = {https://www.slim.eos.ubc.ca/Publications/Public/Conferences/PyHPC/2016/lange2016dtg/lange2016dtg_pres.pdf},
82 | author = {Michael Lange and Navjot Kukreja and Mathias Louboutin and Fabio Luporini and Felippe Vieira Zacarias and Vincenzo Pandolfo and Paulius Velesko and Paulius Kazakas and Gerard Gorman}
83 | }
84 |
85 | @article{Virieux,
86 | author = {J. Virieux and S. Operto},
87 | title = {An overview of full-waveform inversion in exploration geophysics},
88 | journal = {GEOPHYSICS},
89 | volume = {74},
90 | number = {5},
91 | pages = {WCC1-WCC26 },
92 | year = {2009},
93 | doi = {10.1190/1.3238367},
94 | URL = {http://library.seg.org/doi/abs/10.1190/1.3238367},
95 | eprint = {http://library.seg.org/doi/pdf/10.1190/1.3238367}
96 | }
97 |
98 | @article{Pratt,
99 | author = {R. Gerhard Pratt},
100 | title = {Seismic waveform inversion in the frequency domain, Part 1: Theory and verification in a physical scale model},
101 | journal = {GEOPHYSICS},
102 | volume = {64},
103 | number = {3},
104 | pages = {888-901},
105 | year = {1999},
106 | doi = {10.1190/1.1444597},
107 |
108 | URL = {
109 | https://doi.org/10.1190/1.1444597
110 |
111 | },
112 | eprint = {
113 | https://doi.org/10.1190/1.1444597
114 |
115 | }
116 |
117 | }
118 |
119 | @article{haber10TRemp,
120 | Abstract = {Often, parameter estimation problems of parameter-dependent PDEs involve multiple right-hand sides. The computational cost and memory requirements of such problems increase linearly with the number of right-hand sides. For many applications this is the main bottleneck of the computation. In this paper we show that problems with multiple right-hand sides can be reformulated as stochastic programming problems by combining the right-hand sides into a few {\quotedblbase}simultaneous{\textquotedblright} sources. This effectively reduces the cost of the forward problem and results in problems that are much cheaper to solve. We discuss two solution methodologies: namely sample average approximation and stochastic approximation. To illustrate the effectiveness of our approach we present two model problems, direct current resistivity and seismic tomography.},
121 | Author = {Eldad Haber and Matthias Chung and Felix J. Herrmann},
122 | Journal = {SIAM Journal on Optimization},
123 | Keywords = {FWI, Optimization, SLIM},
124 | Month = {7},
125 | Number = {3},
126 | Publisher = {UBC-Earth and Ocean Sciences Department},
127 | Title = {An effective method for parameter estimation with {PDE} constraints with multiple right hand sides},
128 | Url = {http://dx.doi.org/10.1137/11081126X},
129 | Volume = {22},
130 | Year = {2012},
131 | Bdsk-Url-1 = {http://dx.doi.org/10.1137/11081126X}}
132 |
133 | @book{LionsJL1971,
134 | author={Lions, J. L.},
135 | year ={1971},
136 | title={Optimal control of systems governed by partial differential equations},
137 | publisher= {Springer-Verlag Berlin Heidelberg},
138 | ISBN={978-3-642-65026-0},
139 | Edition={1st}
140 | }
--------------------------------------------------------------------------------
/1712_FWI_forward_modeling/README.md:
--------------------------------------------------------------------------------
1 | ## FWI modeling, part 1: Forward modeling
2 |
3 | The manuscript is in a runnable Jupyter Notebook — [manuscript.ipynb](notebooks/manuscript.ipynb). It contains instructions for setting up your environment and installing Devito.
4 |
5 | See [Part 2](https://github.com/seg/tutorials-2018/blob/master/1801_FWI_Adjoint_modeling/notebook/Notebook.ipynb) and [Part 3](https://github.com/seg/tutorials-2018/blob/master/1802_FWI_Inversion/Notebook/Manuscript.ipynb).
6 |
7 | ### Install Devito
8 |
9 | git clone -b v3.1.0 https://github.com/opesci/devito
10 | cd devito
11 | conda env create -f environment.yml
12 | source activate devito
13 | pip install -e .
14 |
15 | Thank you,
16 | The Authors
17 |
--------------------------------------------------------------------------------
/1712_FWI_forward_modeling/notebooks/survey-ship-diagram.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/seg/tutorials-2017/b38f798866dd4e1a38c78cfd45edb7b2cfd3d785/1712_FWI_forward_modeling/notebooks/survey-ship-diagram.png
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # tutorials-2017
2 |
3 | Tutorials from [The Leading Edge](http://library.seg.org/journal/leedff) column, which started in February 2014.
4 |
5 | Most of the tutorials contain [Jupyter Notebooks](https://jupyter.org/). They can be opened and read (but not actually run) right here in GitHub, or you can install the Notebook software (e.g. with **`conda install jupyter`**), then clone this repo, and start a notebook server in the *tutorials-2017* directory.
6 |
7 | For more in-depth hints on getting started, see Hall, M (2016). A user guide to the geophysical tutorials. _The Leading Edge_ **35** (2), 190–191, doi: [10.1190/tle35020190.1](http://library.seg.org/doi/abs/10.1190/tle35020190.1).
8 |
9 | Questions? [Get in touch!](mailto:matt@agilegeoscience.com)
10 |
11 | ## February 2017
12 | - [Step-by-step NMO correction](http://library.seg.org/doi/abs/10.1190/tle36020179.1) by Leonardo Uieda
13 | - [Jupyter Notebook](https://github.com/seg/tutorials-2017/blob/master/1702_Step_by_step_NMO/step-by-step-nmo.ipynb)
14 |
15 | ## April 2017
16 | - [Getting started with CSEM](http://library.seg.org/doi/abs/10.1190/tle36040352.1) by Dieter Werthmüller
17 | - [Jupyter Notebook](https://github.com/seg/tutorials-2017/blob/master/1704_Getting_started_with_CSEM/Notebook.ipynb)
18 |
19 | ## June 2017
20 | - [Seismic rock physics](http://library.seg.org/doi/abs/10.1190/tle36060523.1) by Alessandro Amato del Monte
21 | - [Jupyter Notebook](https://github.com/seg/tutorials-2017/blob/master/1706_Seismic_rock_physics/seismic_rock_physics.ipynb)
22 |
23 | ## August 2017
24 | - [Exploring nonlinear inversions: A 1D magnetotelluric example](http://library.seg.org/doi/abs/10.1190/tle36080696.1) by Seogi Kang, Lindsey J. Heagy, Rowan Cockett, and Douglas W. Oldenburg
25 | - Jupyter Notebooks
26 | - [1_MT1D_NumericalSetup.ipynb](1708_Nonlinear_inversion/1_MT1D_NumericalSetup.ipynb)
27 | - [2_MT1D_ForwardModellingAndNonuniqueness.ipynb](1708_Nonlinear_inversion/2_MT1D_ForwardModellingAndNonuniqueness.ipynb)
28 | - [3_MT1D_5layer_inversion.ipynb](1708_Nonlinear_inversion/3_MT1D_5layer_inversion.ipynb)
29 |
30 | ## October 2017
31 | - [Colored inversion](http://library.seg.org/doi/abs/10.1190/tle36100858.1) by Martin Blouin and Erwan Gloaguen
32 | - [Jupyter Notebook](https://github.com/seg/tutorials-2017/blob/master/1710_Colored_inversion/Colored_inversion_notebook.ipynb)
33 | - The dataset used in this tutorial is the F3 data from the Netherlands, licensed CC-BY-SA by dGB Earth Sciences and TNO, Netherlands.
34 |
35 | ## December 2017
36 | - [FWI, part 1: Forward modeling](https://library.seg.org/doi/abs/10.1190/tle36121033.1) by Mathias Louboutin, Philipp Witte, Michael Lange, Navjot Kukreja, Fabio Luporini, Gerard Gorman, and Felix J. Herrmann
37 | - [Jupyter Notebook](https://github.com/seg/tutorials-2017/blob/master/1712_FWI_forward_modeling/notebooks/manuscript.ipynb)
38 |
39 |
40 |
41 | The content of the articles and of the notebooks is © the author(s) and openly licensed [CC-BY-SA](https://creativecommons.org/licenses/by-sa/3.0/). The code is © the author(s) and openly licensed under the terms of the Apache License 2, or under the terms specified by the author, if any.
42 |
--------------------------------------------------------------------------------