#!/usr/bin/env python
# coding: utf-8
# **Course website**: http://www.leouieda.com/geofisica1
#
# **Note**: This notebook is part of the course "Geofísica 1" 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)
# Esse documento que você está usando é 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).
# # Prática 2 - Gravimetria - A Terra Normal e o distúrbio da gravidade
# ## Objetivos
#
# * Aprender a calcular a gravidade da Terra Normal e o distúrbio da gravidade
# * Gerar mapas do distúrbio para o mundo todo
# * Entender a relação entre o distúrbio e a isostasia
# * Observar o estado de equilíbrio isostático em diferentes regiões do planeta
# ## Instruções
#
# 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.
# ## Preparação
#
# Exectute as células abaixo para carregar as componentes necessárias para nossa prática. Vamos utilizar várias *bibliotecas*, inclusive uma de geofísica chamada [Fatiando a Terra](http://www.fatiando.org).
# In[ ]:
get_ipython().run_line_magic('matplotlib', 'inline')
from __future__ import division
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import ipywidgets as widgets
from IPython.display import display
import seaborn
import fatiando
from icgem import load_icgem_gdf
# In[ ]:
print("Usando a versão do Fatiando: {}".format(fatiando.__version__))
# ## A Terra Normal
# "Terra Normal" é o nome que damos ao elipsóide de referência utilizado para o cálculo de anomalias da gravidade. Um elipsóide geralmente utilizado é o [WGS84](http://en.wikipedia.org/wiki/World_Geodetic_System).
#
# Existem fórmulas para calcular a gravidade (lembre-se que gravidade = gravitação + centrífuga) de um elipsóide em qualquer ponto fora dele. Porém, essas fórmulas são mais complicadas do que queremos para essa aula. Uma alternativa é utilizar a fórmula de Somigliana:
#
# $$
# \gamma(\varphi) = \frac{a \gamma_a \cos^2 \varphi + b \gamma_b \sin^2 \varphi}{\sqrt{a^2 \cos^2 \varphi + b^2 \sin^2 \varphi}}
# $$
#
# $\gamma$ é a gravidade do elipsóide calculada na latitude $\varphi$ e **sobre a superfície do elipsóide** (ou seja, altitude zero).
# $a$ e $b$ são os eixos maior e menor do elipsóide, $\gamma_a$ e $\gamma_b$ são a gravidade do elipsóide no equador e nos polos. Os valores de $a$, $b$, $\gamma_a$ e $\gamma_b$ são tabelados para cada elipsóide. Os valores abaixo são referentes ao WGS84:
#
#
# a | 6378137 | metros |
# b | 6356752.3142 | metros |
# $\gamma_a$ | 9.7803253359 | m/s² |
# $\gamma_b$ | 9.8321849378 | m/s² |
#
#
# Os valores foram retirados do livro:
#
# > Hofmann-Wellenhof, B., and H. Moritz (2006), Physical Geodesy, 2nd, corr. ed. 2006 edition., Springer, Wien ; New York.
# ### Calculando $\gamma$ em uma planilha
# Hoje vamos calcular o valor de $gamma$ utilizando a fórmula de Somigliana em uma planilha. Vamos utilizar o programa LibreOffice Calc (uma versão livre do Microsoft Excel).
#
# ![Screnshot do Calc](https://raw.githubusercontent.com/leouieda/geofisica1/master/images/calc-screen-shot.jpg)
# ### Instruções
#
# **Primeiro**: vocês vão precisar abrir o arquivo com os dados utilizados na [prática passada](http://nbviewer.ipython.org/github/leouieda/geofisica1/blob/master/praticas/1-mapas-interpolacao-gravidade.ipynb) no Calc. Esses arquivos estão em um arquivo de texto chamado `eigen-6c3stat-0_5-mundo.gdf` na [pasta `data`](https://github.com/leouieda/geofisica1/tree/master/data) (peça ajuda para localizar o arquivo no seu computador). **Vá até a pasta e abra esse arquivo e examine seu conteúdo**.
#
# Para abrir o arquivo no Calc, selecione File > Open e navegue até o arquivo. Abrirá uma janela de configuração de importação de texto (Text Import). Nessa janela:
#
# * Informem que os valores no arquivo estão separados por espaços
# * Escolha a opção "Merge delimiters"
# * Verifique que os valores estão separados corretamente
# * Dê "OK" para abrir os dados
#
# **Segundo**: Não vamos editar os dados nesse arquivo diretamente para não perder os dados originais.
#
# * Salve uma cópia (*Save as*) dos dados abertos como uma planilha do LibreOffice (formato ODS)
# * Salve-a na pasta `data` com o nome `disturbio-mundo-{nome do aluno}.ods`, substituindo seu nome (**sem espaços e sem acentos**)
# * Se ainda estiver aberta, feche a planilha com os dados originais para não ter problemas
# * Coloque o nome de cada coluna acima dos valores
# * Apague todas as colunas vazias a esquerda dos dados
# * Apague todas as linhas que não são os dados mesmo (as 4 colunas de lon, lat, altitude e gravidade)
#
# **Terceiro**: Calcule os valores de $\gamma$ para cada ponto do dado.
#
# * Para calcular o seno do valor em uma célula (por exemplo, a A2), utilize a fórmula `=sin(A2)`
# * O seno e o cosseno esperam valores em **radianos**. A latitude na planilha está em graus.
# * Para calcular a raiz quadrada utilize a função: `=sqrt(A2)` por exemplo
# * Cuidado com a ordem dos parênteses: `=A2 + B2/C2` é diferente de `=(A2 + B2)/C2`
# * Utilizando os valores da tabela acima nos dará $\gamma$ em m/s². Precisamos dos valores em **mGal** = 100000 m/s²
#
# **Quarto**: Salve uma cópia da sua planilha no formato Comma Separated Values (`.csv`) para podermos carregá-los no notebook.
#
# **Dicas**:
#
# * Utilize quantas colunas quiser para guardar valores intermediários. Porém, garanta que a **última coluna são os valores de $\gamma$**
# ### Carregando os dados e fazendo um mapa
# Depois de calcular os valores acima, precisamos carregá-los aqui no notebook para gerarmos os mapas.
#
# Primeiro, coloque o nome do seu arquivo `.csv` abaixo e execute a célula.
# In[ ]:
arquivo_dados = '../data/disturbio-mundo-{nome do aluno}.csv'
# Agora, execute as células abaixo para carregar os dados e gerar um mapa com os valores que você calculou.
# In[ ]:
lon, lat, gamma = np.loadtxt(arquivo_dados, delimiter=',', unpack=True, skiprows=1, usecols=[0, 1, -1])
# In[ ]:
bm = Basemap(projection='moll', lon_0=0, resolution='c')
x, y = bm(lon, lat)
# In[ ]:
plt.figure(figsize=(18, 10))
tmp = bm.contourf(x, y, gamma, 100, tri=True, cmap='Reds')
plt.colorbar(orientation='horizontal', pad=0.01, aspect=50, shrink=0.5).set_label('mGal')
plt.title(r"Gravidade da Terra Normal ($\gamma$)", fontsize=16)
# ### Cáculo da Terra Normal no ponto de observação ($\gamma_P$)
# A fórmula de Somgliana nos dá a gravidade da Terra Normal calculada sobre o elipsóide. Nós precisamos de $\gamma$ calculado no ponto onde medimos a gravidade (P) para calcular o distúrbio. Para obter $\gamma_P$, nós podemos utilizar a **correção de ar-livre**. Essa correção nos dá uma approximação de $\gamma_P$:
#
# $$ \gamma_P \approx \gamma - 0.3086 H $$
#
# em que $H$ é a altitude em relação ao elipsóide (altitude geométrica) em **metros**. Lembrando que a correção é feita em **mGal**.
#
# **Calcule $\gamma_P$ em sua planilha** (a mesma que antes). Certifique-se que os valores de $\gamma_P$ estão na última coluna. Após calcular, **salve novamente como CVS** (sobreescreva o arquivo anterior).
#
# Rode as células abaixo para carregar os dados de $\gamma_P$ e gerar um mapa.
# In[ ]:
gamma_p = np.loadtxt(arquivo_dados, delimiter=',', unpack=True, skiprows=1, usecols=[-1])
# In[ ]:
plt.figure(figsize=(18, 10))
tmp = bm.contourf(x, y, gamma_p, 100, tri=True, cmap='Reds')
plt.colorbar(orientation='horizontal', pad=0.01, aspect=50, shrink=0.5).set_label('mGal')
plt.title(r"Gravidade da Terra Normal em P ($\gamma_P$)", fontsize=16)
# ## Distúrbio da gravidade
# O distúrbio da gravidade é definido como:
#
# $$ \delta = g_P - \gamma_P$$
#
# em que $g_P$ é a gravidade medida no ponto P.
#
# **Calcule o distúrbio da gravidade em sua planilha**. Coloque os valores do distúrbio na **última coluna** e **salve como `.csv`**.
#
# Rode as células abaixo para carregar os valores calculados e gerar o mapa.
# In[ ]:
disturbio = np.loadtxt(arquivo_dados, delimiter=',', unpack=True, skiprows=1, usecols=[-1])
# In[ ]:
def varia_escala(escala_de_cor):
plt.figure(figsize=(18, 10))
ranges = np.abs([disturbio.min(), disturbio.max()]).max()
tmp = bm.contourf(x, y, disturbio, 100, tri=True, cmap=escala_de_cor, vmin=-ranges, vmax=ranges)
plt.colorbar(orientation='horizontal', pad=0.01, aspect=50, shrink=0.5).set_label('mGal')
plt.title(u"Distúrbio da gravidade (escala de cor '{}')".format(escala_de_cor), fontsize=16)
# In[ ]:
escalas = 'Reds Blues Greys YlOrBr RdBu_r BrBG PRGn Dark2 jet ocean rainbow gnuplot'.split()
w = widgets.interactive(varia_escala, escala_de_cor=escalas)
display(w)
# []()