#!/usr/bin/env python
# coding: utf-8
# # 1 - Ondas sísmicas
#
# Vamos explorar o que são as ondas sísmicas P e S e e como se comportam, tanto em meios homogêneos como quando há uma interface entre dois meios. Para isso, vamos utilizar 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
#
# * Visualizar como é a propagação de ondas elásticas P e S em meios homogênios
# * Observar o que acontece quando ondas P e S incidem sobre uma interface entre dois meios
# * Entender os conceitos de raios e frentes de onda
# ## Questão para entregar
#
#
# Descreva como é a propagação das ondas P e S e os fatores que diferenciam uma da outra. Fale também sobre o que acontece quando uma onda incide em uma interface que separa dois meios.
#
#
# Lembre-se de colocar **seu nome** e a **data** em sua resposta. A resposta pode ter no **máximo 1 página** (não uma folha).
#
# **As simulações abaixo foram feitas para te ajudar a responder a questão.**
# ## 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
import numpy as np
import matplotlib.pyplot as plt
from fatiando.seismic import RickerWavelet, GaussianWavelet, FDElasticPSV, FDAcoustic2D
# ## Propagração de uma onda P
#
# Vamos simular uma onda P (esqueçam as ondas S por enquanto). Primeiro vamos ver como ela se comporta em um meio homogêneo, sem camadas.
#
# Rode a célula abaixo para criar um modelo da subsuperfície homogêneo. Para não termos ondas S, vamos considerar que estamos em um fluido, como a água.
# In[ ]:
shape = (300, 400)
spacing = 5
extent = [0, shape[1]*spacing, shape[0]*spacing, 0]
# In[ ]:
velocity = np.zeros(shape, dtype='float32') + 1500 # m/s
density = np.zeros(shape, dtype='float32') + 1000 # kg/m³
# Agora vamos criar o nosso simulador de ondas P com uma fonte explosiva na superfície do nosso modelo.
# In[ ]:
pwave = FDAcoustic2D(velocity, density, spacing=spacing)
pwave.add_point_source((0, shape[1]//2), RickerWavelet(1, 60))
# Agora que temos nossa simulação pronta, rode a célcula abaixo para avançar a simulação do tempo 0 até 400 passos no tempo.
# In[ ]:
pwave.run(400)
# Quando a barra acima encher, rode a célula abaixo para gerar uma animação da propagação da onda. Isso pode demorar um pouco. A parte de cima da figura é a superfície.
# In[ ]:
pwave.animate(every=10, embed=True, dpi=50, cutoff=0.5)
# Rode a próxima célula para explorar fotos de cada etapa da simulação, uma de cada vez.
# In[ ]:
pwave.explore(every=20, cutoff=0.5)
# ### Para pensar
#
# * Como varia a amplitude da onda ao longo do tempo?
# * Por que isso acontece?
# * Se nossa simulação fosse num espaço infinito e a rodarmos por um tempo infinito, a onda continuaria existindo e se propagando para sempre?
# ### Nota
#
# Se quiser continuar a simulação e avançá-la mais no tempo, rode novamente a célula `pwave.run(400)` para avançar mais 400 iterações. Depois, rode novamente a célula que cria a animação e ela será atualizada.
# ## Onda P incidindo em uma interface (fluido)
#
# Agora que vocês visualizaram como uma onda P se propaga, vamos ver o que acontece quando a subsuperfície contem duas camadas com velocidades e densidades diferentes. No nosso caso de fluidos, poderiam ser duas camadas de água com temperatuda e salinidade diferentes, fazendo com que a velocidade da onda P e a densidade sejam diferentes.
#
# Vamos fazer um modelo com a camada de baixo mais densa e com velocidade maior. A interface está localizada a 500m de profundidade.
# In[ ]:
twolayer_density = np.zeros(shape, dtype='float32') + 1000
twolayer_velocity = np.zeros(shape, dtype='float32') + 1500
twolayer_density[100:,:] = 1500
twolayer_velocity[100:,:] = 2000
# Novamente, crie a simulação adicione uma fonte explosiva no topo.
# In[ ]:
pwave2 = FDAcoustic2D(twolayer_velocity, twolayer_density, spacing=spacing, taper=0.005)
pwave2.add_point_source((0, shape[1]//2), RickerWavelet(1, 60))
# Rode a simulação por 600 iterações.
# In[ ]:
pwave2.run(700)
# Gere a animação abaixo. O que acontece quando a frente de onda chega na interface?
# In[ ]:
pwave2.animate(every=10, embed=True, dpi=50, cutoff=0.5)
# Rode abaixo para ver cada tempo separado, com calma.
# In[ ]:
pwave2.explore(every=20, cutoff=0.5)
# ### Para pensar
#
# * A proporção de energia refletida e refratada é igual?
# * A curvatura da frente de onda refratada é a mesma que a original?
# * E a da refletida?
# ## Ondas P e S em meios sólidos
#
# Vamos fazer agora uma simulação mais realista que inclui tanto ondas P quanto ondas S propagando em um meio sólido.
#
# Para isso, precisamos definir qual é a velocidade de cada um dos tipos de onda no meio. Note que a onda P é sempre mais rápida que a S.
# In[ ]:
density_solid = np.zeros(shape, dtype='float32') + 2200
vs_solid = np.zeros(shape, dtype='float32') + 3000
vp_solid = np.zeros(shape, dtype='float32') + 4000
# Rode a célula abaixo para criar a simulação de ondas P e S. Dessa vez, **não vamos usar uma fonte explosiva**. A fonte será uma **falha reversa com mergulho de 45 graus**. O epicentro será localizada em profundidade a 750m.
# In[ ]:
ps_wave = FDElasticPSV(vp_solid, vs_solid, density_solid, spacing=spacing)
ps_wave.add_point_source((shape[0]//2, shape[1]//2), dip=45, wavelet=GaussianWavelet(-1, 100))
ps_wave.add_point_source((shape[0]//2 + 1, shape[1]//2 - 1), dip=45, wavelet=GaussianWavelet(1, 100))
# Agora, avance a simulação 400 iterações no tempo.
# In[ ]:
ps_wave.run(400)
# E gere a animação.
# In[ ]:
ps_wave.animate(every=10, plottype=['vectors', 'wavefield'], cutoff=5e-7, scale=5e7,
dpi=80, fps=6, embed=True)
# Note que essa é diferente da outra. Agora, há vetores na imagem além das frentes de onda coloridas. **Os vetores representam a direção e intensidade do deslocamento de cada ponto no meio**. Os pontinhos pretos são vetores com tamanho zero. Note que no começo da animação aparecem vetorres bem grande no centro representando a fonte da onda.
# Novamente, use a célula abaixo para ver cada etapa da simulação separadamente.
# In[ ]:
ps_wave.explore(every=20, plottype=['vectors', 'wavefield'], scale=5e7, cutoff=5e-7)
# ### Para pensar
#
# * Tente achar as ondas P e as S na simulação. Dica: use os vetores de deslocamento.
# * Qual frente de onda é mais rápida?
# * Como é a direção de vibração das ondas P? Ela é uniforme para todas as frentes de onda? Tente explicar esse comportamento.
# ## Onda P incidindo em uma interface (sólido)
#
# Agora que vocês acharam as ondas P e S, vamos fazer a simulação completa do que acontece quando uma onda P encontra uma interface em um meio sólido.
#
# Rode a célula abaixo para criar um modelo com dois meios com velocidades diferentes. A interface entre os dois meios está a 600m.
# In[ ]:
density_twosolid = np.zeros(shape, dtype='float32') + 1800
vs_twosolid = np.zeros(shape, dtype='float32') + 2000
vp_twosolid = np.zeros(shape, dtype='float32') + 3000
l = 120
density_twosolid[l:, :] = 2300
vs_twosolid[l:, :] = 3000
vp_twosolid[l:, :] = 4000
# A simulação que vamos fazer agora usa uma **fonte explosiva**. Esse tipo de fonte gera **somente ondas P**. Vamos ver o que acontece quando essa onda encontra a interface. Para variar um pouco, vamos colocar a fonte no fundo do nosso modelo.
# In[ ]:
ps_twolayer = FDElasticPSV(vp_twosolid, vs_twosolid, density_twosolid, spacing, taper=0.004)
ps_twolayer.add_blast_source((3*shape[0]//5, shape[1]//2), GaussianWavelet(1, 150))
# Agora, avance a simulação.
# In[ ]:
ps_twolayer.run(600)
# E gere a animação. Note que no começo há somente ondas P (pergunta, como você sabe que são só ondas P?).
# In[ ]:
ps_twolayer.animate(every=10, plottype=['vectors', 'wavefield'], every_particle=6,
cutoff=5e-7, scale=3e7, dpi=80, fps=6, embed=True)
# In[ ]:
ps_twolayer.explore(every=20, plottype=['vectors', 'wavefield'],
cutoff=5e-7, scale=3e7, every_particle=6)
# ### Para pensar
#
# * O que acontece quando a onda P incide na interface?
# * A curvatura das frentes de onda refletidas e refratadas são iguais?
# * Avance a simulação no tempo novamente e atualize a animação. O que acontece quando a onda P reflete na superfície? E quando a onda S reflete?
# ## 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)