├── .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 | ![](http://i.giphy.com/WIg8P0VNpgH8Q.gif) 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 | "\"Figure\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 | "![Figure 2](./figures/freqtime.png \"Figure 2\")\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 | "![Figure 3](./figures/anisotropy.png \"Figure 3\")\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 | "![Figure 4](./figures/interactive_edit.png \"Figure 4\")\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 | "![CC-BY-SA](http://mirrors.creativecommons.org/presskit/buttons/88x31/png/by-sa.png)\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 | ![](Figure_1_AADM.png) 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 | ![](Figure_2_AADM.png) 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 | ![](Figure_3_AADM.png) 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 | ![](Figure_4_AADM.png) 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 | "\"plane_wave\"\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 | "![Figure 1](Figures/Figure1.png \"Figure 1\")\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 | "\"Figure\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 | "\"Figure\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 | "\"Figure\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 | "![Figure 5](Figures/Figure5.png \"Figure 5\")\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 | "![Figure 6](Figures/Figure6.png \"Figure 6\")\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 | "\"Figure\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 | ![Figure 1](Figures/Figure1.png "Figure 1") 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 | Figure 2 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 | Figure 3 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 | Figure 4 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 | ![Figure 5](Figures/Figure5.png "Figure 5") 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 | ![Figure 6](Figures/Figure6.png "Figure 6") 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 | Figure 7 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 | --------------------------------------------------------------------------------