#!/usr/bin/env python
# coding: utf-8
# # 5 - Sísmica de reflexão: Reflexão e seções Common Mid Point (CMP)
#
# Nessa aula, vamos começar a estudar a sísmica de reflexão. Veremos como identificar a reflexão na simulação de ondas P e no gráfico de tempo x distância. Vamos simular também uma seção Common Mid Point, na qual movemos a fonte e o receptor mantendo o ponto médio fixo.
#
#
# 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
#
# * Identificar a reflexão no grafico tempo x distância.
# * Explicar por que a reflexão aparece como uma hiperbole nesse gráfico.
# * Identificar a reflexão na seção CMP.
# ## Questão para entregar
#
#
# Explique (deduza) por que a reflexão aparece como uma hipérbole na seção CMP e por que utilizamos essa seção ao invés de um único tiro com offset zero.
#
#
# ### 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[ ]:
get_ipython().run_line_magic('matplotlib', 'inline')
from __future__ import division, print_function
from multiprocessing import Pool, cpu_count
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
import ipywidgets as ipw
from fatiando.seismic import RickerWavelet, FDAcoustic2D
from fatiando.vis import anim_to_html
from fatiando.vis.mpl import seismic_image
# ## Reflexão no gráfico tempo x distância
#
# Vamos utilizar as simulações de onda P para gerar dados sintéticos. Dessa vez também vamos ignorar as ondas S para não complicar a vida mais do que o necessário.
#
# O nosso modelo será uma interface plana separando dois meios.
# In[ ]:
shape = (300, 1000)
spacing = 10
extent = [0, shape[1]*spacing, shape[0]*spacing, 0]
interface = 100
density = np.zeros(shape, dtype='float32') + 2000
density[interface:,:] = 2500
velocity = np.zeros(shape, dtype='float32') + 4000
velocity[interface:,:] = 5000
# In[ ]:
shot = FDAcoustic2D(velocity, density, spacing=spacing, taper=0.004, padding=60)
fonte = (0, 100)
shot.add_point_source(fonte, RickerWavelet(1, 60))
# In[ ]:
shot.run(3000)
# Rode a célula abaixo para gerar uma animação da aquisição.
# In[ ]:
every = 20
frames = shot.simsize//every
receptores = np.arange(fonte[1] + 50, shape[1], 15, dtype='int')
x = receptores*spacing
dados = shot[:, 0, receptores]
times = np.linspace(0, shot.dt*shot.simsize, shot.simsize)
dados_dummy = np.zeros_like(dados)
fig, axes = plt.subplots(2, 1, sharex=True, sharey=False, figsize=(12, 8), facecolor='white')
ax1 = axes[0]
ax1.set_title('iteration: 0')
ax1.set_ylabel('time (s)')
cutoff = 0.4
section = ax1.imshow(dados_dummy, extent=[x.min(), x.max(), times.max(), times.min()],
aspect=1400, cmap='Greys', vmin=-cutoff, vmax=cutoff,
interpolation='nearest')
ax1.set_ylim(0, times.max())
ax2 = axes[1]
ax2.set_xlabel('x (m)')
ax2.set_ylabel('depth (m)')
cutoff = 1
wavefield = ax2.imshow(shot[0, :, :], extent=extent, vmin=-cutoff, vmax=cutoff, cmap='Greys')
ax2.plot(fonte[1]*spacing, 0, '*y', markersize=15)
ax2.plot(x, np.zeros_like(receptores), 'vb', markersize=10)
ax2.hlines(interface*spacing, 0, shape[1]*spacing)
fig.tight_layout(h_pad=0)
def anim_shot(frame):
ax1.set_title('iteration: {:d}'.format(frame*every))
u = shot[frame*every]
wavefield.set_array(u)
dados_dummy[:frame*every, :] = dados[:frame*every, :]
section.set_array(dados_dummy)
return wavefield
anim = FuncAnimation(fig, anim_shot, frames=frames)
anim_to_html(anim, fps=6, dpi=60)
# Na animação acima:
#
# * Os triângulo azuis são os receptores.
# * A estrela amarela é a fonte.
# * O painel de baixo mostra a simulação da propagação da onda.
# * O painel de cima mosta os dados registrados em cada receptor ao longo do tempo. A cor branca significa movimentação para baixo e a cor preta movimentação para cima.
# ### Para pensar
#
# * Tente identificar a onda direta, a refletida e a refratada no ângulo crítico na animação.
# * Repare que a frente de onda refletida se aproxima da direta (no painel de baixo).
# * Isso é condizente com a fórmula para o tempo de chegada da refletida (o que acontece com a fórmula quando x fica grande)?
# ## Simulando um CMP
#
# Agora vamos simular a aquisição de uma seção Common Mid Point. A diferença é que dessa vez utilizaremos vários pares fonte-receptor a distâncias diferentes. Na simulação anterior, utilizamos apenas uma fonte e vários receptores. Cada fonte será uma simulação da qual vamos extrair as medições de um único receptor. A animação abaixo deixará isso mais claro.
# In[ ]:
shape = (100, 200)
spacing = 10
extent = [0, shape[1]*spacing, shape[0]*spacing, 0]
interface = shape[0]//2
density = np.zeros(shape, dtype='float32') + 2000
density[interface:,:] = 2500
velocity = np.zeros(shape, dtype='float32') + 4000
velocity[interface:,:] = 5000
# In[ ]:
step = 3
fontes = np.array(list(reversed(range(55, shape[1]//2 - step//2, step))))
recep = np.array([shape[1] - s for s in fontes])
offsets = (recep - fontes)*spacing
print("Utilizando {} fontes e {} receptores.".format(len(fontes), len(recep)))
print('Fontes (m): {}'.format(fontes))
print('Receptores (m): {}'.format(recep*spacing))
print('Offsets (m): {}'.format(offsets))
# Rode as células abaixo para rodar uma simulação para cada fonte acima. Não aparecerá a barrinha de progresso dessa vez pois vamos rodar as simulações em paralelo para agilizar o processo.
# In[ ]:
def simul_shot(fonte, its=800, verbose=False):
shot = FDAcoustic2D(velocity, density, spacing=spacing, taper=0.005, padding=50, verbose=verbose)
shot.add_point_source((0, fonte), RickerWavelet(1, 100))
shot.run(its)
return shot
# In[ ]:
get_ipython().run_cell_magic('time', '', "print('Simulando...')\npool = Pool(processes=cpu_count())\nshots = pool.map(simul_shot, fontes)\npool.close()\nprint('Terminado.')\n")
# Rode a célula abaixo para gerar uma animação da aquisição do CMP.
# In[ ]:
every = 30
frames = shots[0].simsize//every
dt = shots[0].dt
times = np.linspace(0, dt*shots[0].simsize, shots[0].simsize)
CMP = np.empty((shots[0].simsize, len(recep)))
for i, s in enumerate(shots):
CMP[:, i] = s[:, 0, recep[i]]
CMP_dummy = np.zeros_like(CMP)
fig, axes = plt.subplots(2, 1, sharex=False, sharey=False, figsize=(7, 8), facecolor='white')
ax1 = axes[1]
ax1.set_title('shot: 1')
ax1.set_xlabel('x (m)')
ax1.set_ylabel('depth (m)')
cutoff = 1
wavefield = ax1.imshow(shots[0][500, :, :], extent=extent, vmin=-cutoff, vmax=cutoff, cmap='Greys')
src, = ax1.plot(fontes[0]*spacing, 0, '*y', markersize=15)
rec, = ax1.plot(recep[0]*spacing, 0, 'vb', markersize=10)
ax1.hlines(interface*spacing, 0, shape[1]*spacing)
ax2 = axes[0]
ax2.set_title('CMP: 1')
ax2.set_xlabel('offset (m)')
ax2.set_ylabel('times (s)')
cutoff = 1
section = ax2.imshow(CMP_dummy, extent=[offsets.min(), offsets.max(), times.min(), times.max()],
aspect=690, cmap='Greys', vmin=-cutoff, vmax=cutoff, interpolation='nearest')
fig.tight_layout()
def anim_shot(i):
shot = i//frames
frame = i%frames
ax1.set_title('shot: {:d}'.format(shot + 1))
u = shots[shot][frame*every]
wavefield.set_array(u)
src.set_xdata(fontes[shot]*spacing)
rec.set_xdata(recep[shot]*spacing)
ax2.set_title('CMP: {:d}'.format(shot + 1))
CMP_dummy[:, :shot] = CMP[:, :shot]
CMP_dummy[:frame*every, shot] = CMP[:frame*every, shot]
section.set_array(CMP_dummy)
return wavefield, CMP_dummy
anim = FuncAnimation(fig, anim_shot, frames=frames*len(shots))
anim_to_html(anim, fps=6, dpi=60)
# Na animação acima:
#
# * O painel de baixo mostra a simulação de cada tiro.
# * A estrela representa a fonte e o triângulo representa o receptor.
# * O painel de cima mostra a seção CMP. Cada coluna nesse gráfico representa os dados medidos por um receptor.
# ### Para pensar
#
# * Identifique a onda direta e a reflexão no CMP.
# * De quais parâmetros depende a curva do tempo de chegada da onda refletida?
# * O que conseguimos obter com um CMP que não podemos obter com um único par fonte-receptor?
# * Por que utilizar um CMP ao invés de um único tiro com vários receptores, como na primeira simulação?
# * O CMP nos dá informação sobre toda a subsuperfície? Ou seja, com 1 único CMP podemos obter seção sísmica que vocês viram na estratigrafia?
# * É prático fazer a aquisição de CMPs da forma como simulamos (dê um tiro, mova fonte e receptor, dê um tiro, ...)?
# ## 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)