{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 3 - Refração crítica\n", "\n", "Hoje vamos estudar o fenômeno da refração no ângulo crítico (ângulo de incidência que gera refração a 90°). Essa onda possui propriedades distintas que possibilitam seu uso para inferir propriedades da subsuperfície (o método da sísmica de refração). Veremos quais são essas propriedades e possíveis fatores limitantes para a aplicação do método.\n", "\n", "Utilizaremos as simulações de ondas da biblioteca [Fatiando a Terra](http://www.fatiando.org). Essas simulações utilizam o [método de diferenças finitas](http://en.wikipedia.org/wiki/Finite_difference_method) para calcular soluções da equação da onda." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Objetivos\n", "\n", "* Observar como a refração crítica ocorre durante a propagação de ondas P.\n", "* Verificar as condições para que haja a refração crítica.\n", "* Treinar como calcular o ângulo crítico e a distância mínima para haver refração crítica." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Questão para entregar\n", "\n", "
\n", "Explique o fenômeno da refração no ângulo crítico.\n", "

\n", "Sua resposta deve conter no mínimo:\n", "

\n", "\n", "
\n", "\n", "### Regras para a resposta\n", "\n", "* Coloque **nome, data e o número da prática** em sua resposta. \n", "* A resposta pode ter no **máximo 1 página** (não uma folha).\n", "* **Execute o notebook** antes de responder. As simulações abaixo foram feitas para te ajudar.\n", "* **Pense e organize** sua resposta andtes de começar a escrever." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Instruções\n", "\n", "Esse documento é um [Jupyter notebook](http://jupyter.org/), um documento interativo que mistura texto (como esse), código (como abaixo), e o resultado de executar o código (números, texto, figuras, videos, etc).\n", "\n", "O notebook te fornecerá exemplos interativos que trabalham os temas abordados no questionário. Utilize esses exemplos para responder as perguntas.\n", "\n", "As células com números ao lado, como `In [1]:`, são código [Python](http://python.org/). Algumas dessas células não produzem resultado e servem de preparação para os exemplos interativos. Outras, produzem gráficos interativos. **Você deve executar todas as células, uma de cada vez**, mesmo as que não produzem gráficos.\n", "\n", "**Para executar uma célula**, clique em cima dela e aperte `Shift + Enter`. O foco (contorno verde ou cinza em torno da célula) deverá passar para a célula abaixo. Para rodá-la, aperte `Shift + Enter` novamente e assim por diante. Você pode executar células de texto que não acontecerá nada." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Setup\n", "\n", "Rode as células abaixo para carregar os módulos necessários para essa prática." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/home/leo/miniconda3/envs/geofisica2/lib/python2.7/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.\n", " from ._conv import register_converters as _register_converters\n" ] } ], "source": [ "%matplotlib inline\n", "from __future__ import division, print_function\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import ipywidgets as ipw\n", "from fatiando.seismic import RickerWavelet, FDAcoustic2D" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Onda P gerada por uma fonte na superfície\n", "\n", "Vamos simular uma onda P incidindo na interface entre dois meios gerada por uma explosão na superfície. \n", "\n", "Dessa vez, vamos ignorar as ondas S para não complicar a vida." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "shape = (250, 900)\n", "spacing = 30\n", "extent = [0, shape[1]*spacing, shape[0]*spacing, 0]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Vp1 = 3000 m/s\n", "Vp2 = 4000 m/s\n" ] } ], "source": [ "vp1 = 3000\n", "vp2 = 4000\n", "print(\"Vp1 = {} m/s\".format(vp1))\n", "print(\"Vp2 = {} m/s\".format(vp2))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Interface entre os dois meios a 2400 m de profundidade.\n" ] } ], "source": [ "density = np.zeros(shape, dtype='float32') + 2000\n", "velocity = np.zeros(shape, dtype='float32') + vp1\n", "interface = 80\n", "density[interface:,:] = 2300\n", "velocity[interface:,:] = vp2\n", "print(\"Interface entre os dois meios a {} m de profundidade.\".format(interface*spacing))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "A fonte será uma explosão na superfície com as seguintes coordenadas:" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Coordenadas da fonte:\n", " x = 5400 m\n", " z = 0 m\n" ] } ], "source": [ "fonte = (0, shape[1]//5)\n", "print('Coordenadas da fonte:')\n", "print(' x = {} m'.format(fonte[1]*spacing))\n", "print(' z = {} m'.format(fonte[0]*spacing))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Agora vamos criar o nosso simulador de ondas P com uma fonte explosiva na superfície do nosso modelo." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "simul = FDAcoustic2D(velocity, density, spacing=spacing)\n", "simul.add_point_source(fonte, RickerWavelet(1, 30))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Agora que temos nosso simulador pronto, rode a célcula abaixo para avançar a simulação no tempo. Essa simulação vai demorar um pouco para terminar." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[##################################################] | 100% Completed | 52.3s\n" ] } ], "source": [ "simul.run(2000)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Rode a célula abaixo para gerar a animação." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " " ], "text/plain": [ "" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "simul.animate(every=30, embed=True, dpi=60, cutoff=2, fps=6, cmap='Greys')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note que na simulação existem ondas refletindo nas bordas da área. **Ignorem essas ondas**. Elas são artefatos da simulação que são difíceis de evitar." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Rode a próxima célula para gerar uma figura interativa com:\n", "\n", "* As frentes de onda para cada etapa da simulação, uma de cada vez.\n", "* Os raios das ondas incidente e refratada para um ângulo de incidência que você poderá controlar.\n", "* Um marcador (azul) que você poderá controlar a distância e o ângulo (use para achar a coordenada x de algum evento ou seu ângulo de propagação)." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "12a28b9be89a40a18b72d62aa2751813", "version_major": 2, "version_minor": 0 }, "text/html": [ "

Failed to display Jupyter Widget of type interactive.

\n", "

\n", " If you're reading this message in the Jupyter Notebook or JupyterLab Notebook, it may mean\n", " that the widgets JavaScript is still loading. If this message persists, it\n", " likely means that the widgets JavaScript library is either not installed or\n", " not enabled. See the Jupyter\n", " Widgets Documentation for setup instructions.\n", "

\n", "

\n", " If you're reading this message in another frontend (for example, a static\n", " rendering on GitHub or NBViewer),\n", " it may mean that your frontend doesn't currently support widgets.\n", "

\n" ], "text/plain": [ "interactive(children=(IntSlider(value=0, description=u'tempo', max=1999, step=50), FloatSlider(value=45.0, description=u'incidencia', max=90.0, step=0.5), FloatSlider(value=10000.0, description=u'x', max=27000.0, step=500.0), FloatSlider(value=0.0, description=u'angulo', max=90.0, step=0.5), Output()), _dom_classes=('widget-interact',))" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "def plot_with_rays(tempo, incidencia, x, angulo):\n", " fig = plt.figure()\n", " ax = plt.subplot(111)\n", " simul.snapshot(frame=tempo, ax=ax, cutoff=2, cmap='Greys')\n", " fig.set_size_inches(14, 5.4)\n", " ax.set_title('Tempo em segundos: {} s'.format(tempo*simul.dt))\n", " y_bottom = shape[0]*spacing\n", " y_interface = interface*spacing\n", " y_source = fonte[0]*spacing\n", " x_source = fonte[1]*spacing\n", " x_incidence = (np.tan(np.radians(incidencia))*(y_interface - y_source)\n", " + x_source)\n", " ax.plot([x_source, x_incidence], [y_source, y_interface], '-k', linewidth=2)\n", " arg = (vp2/vp1)*np.sin(np.radians(incidencia))\n", " if arg <= 1:\n", " refract = np.arcsin(arg)\n", " x_refract = (np.tan(refract)*(y_bottom - y_interface) + x_incidence)\n", " ax.plot([x_incidence, x_refract], [y_interface, y_bottom], '-r', linewidth=2) \n", " tmp = np.tan(np.radians(angulo))\n", " x_marc_topo = (y_interface - 0)*tmp + x\n", " x_marc_base = (y_interface - y_bottom)*tmp + x\n", " ax.plot([x_marc_base, x_marc_topo], [y_bottom, 0], '--b', linewidth=2)\n", " ax.hlines(y_interface, 0, shape[1]*spacing, colors='grey')\n", " \n", "ipw.interactive(plot_with_rays, \n", " tempo=ipw.IntSlider(value=0, min=0, max=simul.it, step=50),\n", " incidencia=ipw.FloatSlider(value=45, min=0, max=90, step=0.5),\n", " x=ipw.FloatSlider(value=10e3, min=0, max=shape[1]*spacing, step=500),\n", " angulo=ipw.FloatSlider(value=0, min=0, max=90, step=0.5))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Para pensar\n", "\n", "* Use a figura acima para descobrir o caminho que a onda refratada no ângulo crítico percorre até um ponto na superfície. **Dica**: tente achar o caminho que é perpendicular a frente de onda que volta para a superfície.\n", "* Qual é o ângulo com o qual a onda refratada no ângulo crítico retorna a superfície?\n", "* Qual é a distância mínima da fonte para que haja refração no ângulo crítico? Tente calcular essa distância?\n", "* Sabendo a distância acima, qual seria a distância mínima para que a refração seja observada na superfície?\n", "* Tente observar quando a onda refratada no ângulo crítico passa pelas outras **na superfície**.\n", "* O que acontece quando a onda refletida na superfície incide na interface com ângulo crítico? " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## License and information\n", "\n", "**Course website**: https://github.com/leouieda/geofisica2\n", "\n", "**Note**: This notebook is part of the course \"Geofísica 2\" of Geology program of the \n", "[Universidade do Estado do Rio de Janeiro](http://www.uerj.br/). \n", "All content can be freely used and adapted under the terms of the \n", "[Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/).\n", "\n", "![Creative Commons License](https://i.creativecommons.org/l/by/4.0/88x31.png)" ] } ], "metadata": { "anaconda-cloud": {}, "kernelspec": { "display_name": "Python 2", "language": "python", "name": "python2" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 2 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython2", "version": "2.7.14" } }, "nbformat": 4, "nbformat_minor": 1 }