Professores: Leonardo Uieda e Eder Molina
Conteúdo da parte em Python
Nesta parte da matéria aprenderemos técnicas de engenharia de software e programação em Python em um nível mais avançado. O problema geofísico que utilizaremos de motivação é o cálculo do campo geomagnético segundo o modelo IGRF.
O IGRF é um modelo de harmônicos esféricos. Com esses modules, podemos calcular as 3 componentes do campo geomagnético em qualquer local da Terra através de uma tabela de números chamados coeficientes de Gauss. Para um determinado conjunto de coeficientes de Gauss $g_n^m$ e $h_n^m$, as 3 componentes do campo geomagnético são:
\[B_n(r, \theta, \lambda) = \sum\limits_{n=1}^{N}\sum\limits_{m=0}^{n} \left(\dfrac{R}{r}\right)^{n+2} [ g_n^m \cos m\lambda + h_n^m \sin m\lambda ] \dfrac{\partial P_n^m(\cos\theta)}{\partial \theta}\] \[B_e(r, \theta, \lambda) = -\dfrac{1}{\sin\theta} \sum\limits_{n=1}^{N}\sum\limits_{m=0}^{n} \left(\dfrac{R}{r}\right)^{n+2} [ -m g_n^m \sin m\lambda + m h_n^m \cos m\lambda ] P_n^m(\cos\theta)\] \[B_r(r, \theta, \lambda) = \sum\limits_{n=1}^{N}\sum\limits_{m=0}^{n} (n + 1)\left(\dfrac{R}{r}\right)^{n+2} [ g_n^m \cos m\lambda + h_n^m \sin m\lambda ] P_n^m(\cos\theta)\]em que $r$ é a direção radial, $\theta$ é a colatitude geocêntrica, $\lambda$ é a longitude, $n$ é o grau, $m$ é a ordem, $R$ é o raio médio da Terra e $P_n^m(x)$ são funções associadas de Legendre.
A tabela com os coeficientes de Gauss para cada 5 anos pode ser baixada do site do NOAA. Com os coeficientes, podemos utilizar as fórmulas acima para calcular o campo geomagnético para qualquer data. Com a tabela de coeficientes também podemos calcular o momento magnético de um dipolo geocêntrico:
\[m_X = \dfrac{4\pi}{\mu_0} R^3 g_1^1\] \[m_Y = \dfrac{4\pi}{\mu_0} R^3 h_1^1\] \[m_Z = \dfrac{4\pi}{\mu_0} R^3 g_1^0\]O momento pode ser convertido para coordenadas esféricas e providenciar a longitude e latitude do polo geomagnético.
As funções associadas de Legendre podem ser calculadas com as fórmulas recursivas:
\[P_n^m (x) = \dfrac{(2n - 1) x P_{n-1}^m - (n + m - 1)P_{n-2}^m}{n - m}\quad \text{para}\ m < n - 1\] \[P_n^m (x) = \dfrac{(2n - 1) x P_{n-1}^m}{n - m}\quad \text{para}\ m = n - 1\] \[P_n^m (x) = (2n -1)\sqrt{1-x^2}P_{n-1}^{m-1} \quad \text{para}\ m = n\]Sabendo os valores iniciais: $P_0^0 = 1$, $P_1^0 = x$, $P_1^1=\sqrt{1 - x^2}$.
As derivadas $\dfrac{\partial P_n^m}{\partial \theta}(\cos\theta)$ também são calculadas assim:
\[\dfrac{\partial P_n^0}{\partial \theta} (\cos\theta) = - P_n^1(\cos\theta)\] \[\dfrac{\partial P_n^m}{\partial \theta} (\cos\theta) = \dfrac{1}{2}\left[(n + m)(n - m + 1) P_n^{m-1} - P_n^{m + 1}\right] \quad \text{para}\ n \ge 1, m > 0\]Para testar os cálculos das funções de Legendre, podemos usar as soluções analíticas abaixo:
\[P_2^0(x) = \dfrac{1}{2} (3x^2 - 1)\] \[P_2^1(x) = 3x\sqrt{1 - x^2}\] \[P_2^2(x) = 3(1 - x^2)\] \[P_3^0(x) = \dfrac{1}{2} (5x^3 - 3x)\] \[P_3^1(x) = -\dfrac{3}{2} (1 - 5x^2)\sqrt{1 - x^2}\] \[P_3^2(x) = 15 x (1 - x^2)\] \[P_3^3(x) = 15 \sqrt{1 - x^2}^3\] \[P_4^0(x) = \dfrac{1}{8}(35x^4 - 30x^2 + 3)\] \[P_4^1(x) = \dfrac{5}{2} (7 x^3 - 3 x) \sqrt{1 - x^2}\] \[P_4^2(x) = \dfrac{15}{2} (7 x^2 - 1) (1 - x^2)\] \[P_4^3(x) = 105 x \sqrt{1 - x^2}^3\] \[P_4^4(x) = 105 \sqrt{1 - x^2}^4\]IMPORTANTE: As equações na página da Wikipedia incluem a fase de Condon-Shortly, que não é usada no geomagnetismo. Isso implica em algumas das relações recursivas e soluções analíticas terem o sinal invertido. Mais detalhes nesse relatório da implementação das funções de Legendre no GSL.
Nas aplicações em geomagnetismo, as funções de Legendre e suas derivadas são normalizadas com a normalização de Schmidt multiplicando-os pelo fator:
\[S_n^m = \sqrt{(2 - \delta_{m,0})\dfrac{(n - m)!}{(n + m)!}}\]na qual $\delta_{m,0}$ é o delta de Kronecker.
Esse problema pode ser decomposto em diversas etapas computacionais. Melhor ainda, cada etapa pode ser encapsulada em 1 ou mais funções que podem ser testadas independentemente. Ao final dessa disciplina, teremos funções e programas de linha de comando que serão capazes de calcular o campo geomagnético em qualquer lugar da Terra e em qualquer data entre 1900 e o presente.
Cronograma
O cronograma provavelmente sofrerá alterações ao longo do semestre.
Semana | Tema | Produto |
---|---|---|
6 | Apresentação do problema / Revisão de Python / Lendo dados de arquivos | Código que lê o arquivo de coeficientes de Gauss |
7 | Programação defensiva / Refatoração de código em funções | Testes para parâmetros de entrada e saída + função com o código da aula anterior |
8 | Cálculo do polo magnético / Mapas com PyGMT | Função que calcula o momento de dipolo + latitude e longitude do polo magnético dadas coeficientes de Gauss |
9 | Lindando com datas e interpolação linear | Função que produz coeficientes de Gauss para qualquer data |
10 | As tais das funções de Legendre | Função que retorna as funções associadas de Legendre |
11 | Calculando o campo magnético | Função que calculam Be, Bn, Bu para uma data |
12 | Malhas regulares em Python / xarray + netCDF | Função que produz malhas regulares do campo magnético |
13 | Programas de linha de comando em Python | Transformação das funções em um programa de linha de comando |
14 | Optimização e perfilagem de código / acelerando as funções de Legendre com numba | Função que calcula as funções de Legendre de forma mais rápida |
15 | Livre |