#!/usr/bin/env python
# coding: utf-8
# # 2 - Reflexão e refração: Lei de Snell
#
# Como é o ângulo de reflexão e refração das ondas P e S para diferentes ângulos de incidência? E como isso varia dependendo das velocidades de onda sísmica do meio? A Lei de Snell explica:
#
# $$\dfrac{\sin \theta_1}{V_1} = \dfrac{\sin \theta_2}{V_2}$$
#
# Nessa prática, vocês deverão usar a Lei de Snell para prever e explicar o comportamento das ondas P e S ao se depararem com uma interface.
#
# 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.
# ## Objetivos
#
# * Entender como funciona a Lei de Snell
# * Observar as previsões da Lei de Snell na propagação de ondas P e S
# * Checar se os valores previstos na Lei de Snell são observados nas simulações
# ## Questão para entregar
#
#
# Utilize a Lei de Snell para explicar como serão os ângulos de reflexão e refração das ondas P e S quando uma onda P incide em uma interface. Sua resposta deve explicar como isso varia dependendo das velocidades das ondas sísmicas e possíveis casos extremos e limites.
#
#
# ### Regras para a resposta
#
# * Coloque **nome, data e o número da prática** em sua resposta.
# * A resposta pode ter no **máximo 1 página** (não uma folha).
# * **Execute o notebook** antes de responder. As simulações abaixo foram feitas para te ajudar.
# * **Pense e organize** sua resposta andtes de começar a escrever.
# ## Instruções
#
# 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).
#
# O notebook te fornecerá exemplos interativos que trabalham os temas abordados no questionário. Utilize esses exemplos para responder as perguntas.
#
# 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.
#
# **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.
# ## Setup
#
# Rode as células abaixo para carregar os módulos necessários para essa prática.
# In[1]:
get_ipython().run_line_magic('matplotlib', 'inline')
from __future__ import division, print_function
import numpy as np
import matplotlib.pyplot as plt
import ipywidgets as ipw
from fatiando.seismic import RickerWavelet, GaussianWavelet, FDElasticPSV, FDAcoustic2D
# ## Incidência de ondas P em meios fluidos: V1 < V2
#
# Vamos simular uma onda P incidindo na interface entre dois meios fluidos com velocidades aumentando com a profundidade.
# In[2]:
shape = (200, 600)
spacing = 5
extent = [0, shape[1]*spacing, shape[0]*spacing, 0]
# In[3]:
vp1 = 1500
vp2 = 2000
# In[4]:
increase_density = np.zeros(shape, dtype='float32') + 1000
increase_velocity = np.zeros(shape, dtype='float32') + vp1
increase_density[100:,:] = 1500
increase_velocity[100:,:] = vp2
# Agora vamos criar o nosso simulador de ondas P com uma fonte explosiva na superfície do nosso modelo.
# In[5]:
p_increase = FDAcoustic2D(increase_velocity, increase_density, spacing=spacing)
fonte = (0, shape[1]//4)
p_increase.add_point_source(fonte, RickerWavelet(1, 60))
# Agora que temos nosso simulador pronto, rode a célcula abaixo para avançar a simulação no tempo.
# In[6]:
p_increase.run(1500)
# Essa simulação pode demorar um pouco para terminar.
# In[7]:
p_increase.animate(every=20, embed=True, dpi=60, cutoff=0.4, fps=7)
# Rode a próxima célula para explorar fotos de cada etapa da simulação, uma de cada vez. A figura também mostrará 3 raios (onda incidente, refletida e refratada) para um determinado ângulo de incidência que você poderá controlar. Os ângulos de refração e reflexão são calculados com a Lei de Snell.
# In[8]:
def plot_with_p_rays_increasing(tempo, incidencia):
fig = plt.figure()
ax = plt.subplot(111)
p_increase.snapshot(frame=tempo, ax=ax, cutoff=0.2, cmap='Greys')
fig.set_size_inches(14, 5.5)
y_bottom = shape[0]*spacing
y_interface = 100*spacing
y_source = fonte[0]*spacing
x_source = fonte[1]*spacing
x_incidence = (np.tan(np.radians(incidencia))*(y_interface - y_source)
+ x_source)
x_reflect = 2*x_incidence - x_source
arg = (vp2/vp1)*np.sin(np.radians(incidencia))
if arg <= 1:
refract = np.arcsin(arg)
x_refract = (np.tan(refract)*(y_bottom - y_interface) + x_incidence)
ax.plot([x_incidence, x_refract], [y_interface, y_bottom], '-r', linewidth=2)
ax.plot([x_source, x_incidence], [y_source, y_interface], '-k', linewidth=2)
ax.plot([x_incidence, x_reflect], [y_interface, 0], '-b', linewidth=2)
ax.hlines(y_interface, 0, shape[1]*spacing, colors='grey')
ipw.interactive(plot_with_p_rays_increasing,
tempo=ipw.IntSlider(value=0, min=0, max=p_increase.it, step=50),
incidencia=ipw.FloatSlider(value=45, min=0, max=90, step=0.5))
# ### Para pensar
#
# * Como será a proporção entre o ângulo de incidência e o ângulo de reflexão?
# * E com o ângulo de refração?
# * Calcule os valores com base na Lei de Snell e cheque com o que você vê no gráfico.
# * Como esses ângulos se relacionam com as curvaturas das frentes de onda?
# * Por que no final da simulação a onda refratada se separa da onda refletida e incidente?
# * Por que não há refração acima de um determinado ângulo?
# * Qual ângulo é esse?
# ## Incidência de ondas P em meios fluidos: V1 > V2
#
# Agora vamos ver o que acontece quando a velocidade diminui com a profundidade.
# In[9]:
vp1_diminui = 1500
vp2_diminui = 1000
# In[10]:
decrease_density = np.zeros(shape, dtype='float32') + 1500
decrease_velocity = np.zeros(shape, dtype='float32') + vp1_diminui
decrease_density[100:,:] = 2000
decrease_velocity[100:,:] = vp2_diminui
# Novamente, crie a simulação com uma fonte explosiva no topo e a avance no tempo.
# In[11]:
p_decrease = FDAcoustic2D(decrease_velocity, decrease_density, spacing=spacing)
p_decrease.add_point_source(fonte, RickerWavelet(1, 60))
# In[12]:
p_decrease.run(1500)
# In[13]:
p_decrease.animate(every=20, embed=True, dpi=60, cutoff=0.4, fps=7)
# Rode abaixo para gerar a mesma figura interativa da simulação anterior.
# In[14]:
def plot_with_p_rays_decreasing(tempo, incidencia):
fig = plt.figure()
ax = plt.subplot(111)
p_decrease.snapshot(frame=tempo, ax=ax, cutoff=0.4, cmap='Greys')
fig.set_size_inches(14, 5.5)
y_bottom = shape[0]*spacing
y_interface = 100*spacing
y_source = fonte[0]*spacing
x_source = fonte[1]*spacing
x_incidence = (np.tan(np.radians(incidencia))*(y_interface - y_source)
+ x_source)
x_reflect = 2*x_incidence - x_source
arg = (vp2_diminui/vp1_diminui)*np.sin(np.radians(incidencia))
if arg <= 1:
refract = np.arcsin(arg)
x_refract = (np.tan(refract)*(y_bottom - y_interface) + x_incidence)
ax.plot([x_incidence, x_refract], [y_interface, y_bottom], '-r', linewidth=2)
ax.plot([x_source, x_incidence], [y_source, y_interface], '-k', linewidth=2)
ax.plot([x_incidence, x_reflect], [y_interface, 0], '-b', linewidth=2)
ax.hlines(y_interface, 0, shape[1]*spacing, colors='grey')
ipw.interactive(plot_with_p_rays_decreasing,
tempo=ipw.IntSlider(value=0, min=0, max=p_decrease.it, step=50),
incidencia=ipw.FloatSlider(value=45, min=0, max=90, step=0.5))
# ### Para pensar
#
# * Como será a proporção entre os ângulos de incidência, reflexão e refração?
# * Calcule os valores com base na Lei de Snell e cheque com o que você vê no gráfico.
# * O que mudou em relação a simulação anterior? Isso é condizente com a Lei de Snell?
# ## Incidência de ondas P em meios sólidos
#
# Vamos fazer agora uma simulação que inclui tanto ondas P quanto ondas S propagando em um meio sólido. A onda P irá passar para um meio com velocidades maiores.
# In[15]:
vp1_solido = 3000
vp2_solido = 4000
vs1_solido = 2000
vs2_solido = 3000
# In[16]:
shape2 = (300, 600)
l = 150
twosolid_density = np.zeros(shape2, dtype='float32') + 1800
twosolid_density[l:, :] = 2100
twosolid_vs = np.zeros(shape2, dtype='float32') + vs1_solido
twosolid_vs[l:, :] = vs2_solido
twosolid_vp = np.zeros(shape2, dtype='float32') + vp1_solido
twosolid_vp[l:, :] = vp2_solido
# Rode as células abaixo para criar e rodar a simulação utilizando uma fonte explosiva na superfície.
# In[17]:
fonte_explosiva = (70, shape[1]//4)
# In[18]:
ps_twosolid = FDElasticPSV(twosolid_vp, twosolid_vs, twosolid_density, spacing=spacing)
ps_twosolid.add_blast_source(fonte_explosiva, GaussianWavelet(1, 100))
# In[19]:
ps_twosolid.run(1200)
# In[20]:
ps_twosolid.animate(every=20, plottype=['vectors', 'wavefield'],
cutoff=1e-6, scale=1e7, every_particle=10,
dpi=60, fps=6, embed=True)
# Novamente, use a célula abaixo para ver cada etapa da simulação separadamente e os raios correspondentes as reflexões e refrações.
# In[21]:
def plot_with_ps_rays(tempo, incidencia):
fig = plt.figure()
ax = plt.subplot(111)
ps_twosolid.snapshot(frame=tempo, ax=ax, plottype=['wavefield'],
cutoff=1e-6, every_particle=10, cmap='Greys')
fig.set_size_inches(14, 6.5)
y_bottom = shape2[0]*spacing
y_interface = l*spacing
y_source = fonte_explosiva[0]*spacing
x_source = fonte_explosiva[1]*spacing
x_incidence = (np.tan(np.radians(incidencia))*(y_interface - y_source)
+ x_source)
ax.plot([x_source, x_incidence], [y_source, y_interface], '-k', linewidth=2)
# P reflection
x_preflect = (np.tan(np.radians(incidencia))*(y_interface - 0) + x_incidence)
ax.plot([x_incidence, x_preflect], [y_interface, 0], '-b', linewidth=2)
# S reflection
sreflect = np.arcsin((vs1_solido/vp1_solido)*np.sin(np.radians(incidencia)))
x_sreflect = (np.tan(sreflect)*(y_interface - 0) + x_incidence)
ax.plot([x_incidence, x_sreflect], [y_interface, 0], '--b', linewidth=2)
# P refraction
arg = (vp2_solido/vp1_solido)*np.sin(np.radians(incidencia))
if arg <= 1:
prefract = np.arcsin(arg)
x_prefract = (np.tan(prefract)*(y_bottom - y_interface) + x_incidence)
ax.plot([x_incidence, x_prefract], [y_interface, y_bottom], '-r', linewidth=2)
# S refraction
arg = (vs2_solido/vp1_solido)*np.sin(np.radians(incidencia))
if arg <= 1:
srefract = np.arcsin(arg)
x_srefract = (np.tan(srefract)*(y_bottom - y_interface) + x_incidence)
ax.plot([x_incidence, x_srefract], [y_interface, y_bottom], '--r', linewidth=2)
ax.hlines(y_interface, 0, shape[1]*spacing, colors='grey')
ipw.interactive(plot_with_ps_rays,
tempo=ipw.IntSlider(value=0, min=0, max=ps_twosolid.it, step=50),
incidencia=ipw.FloatSlider(value=45, min=0, max=90, step=0.5))
# ### Para pensar
#
# * Como é a proporção do ângulo de reflexão das ondas P e S?
# * E o ângulo de refração?
# * Como seria se a velocidade diminuísse com a profunidade?
# ## License and information
#
# **Course website**: https://github.com/leouieda/geofisica2
#
# **Note**: This notebook is part of the course "Geofísica 2" of Geology program of the
# [Universidade do Estado do Rio de Janeiro](http://www.uerj.br/).
# All content can be freely used and adapted under the terms of the
# [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/).
#
# ![Creative Commons License](https://i.creativecommons.org/l/by/4.0/88x31.png)