• Nenhum resultado encontrado

Nesta ´ultima etapa, almeja-se gerar o m´aximo de c´odigo poss´ıvel fazendo uso do SymPy e de suas funcionalidades de gera¸c˜ao de c´odigo C. Dessa maneira, ´e poss´ıvel se desvencilhar do c´odigo gerado pelo Devito, fazendo uso de um template cujo c´odigo principal, ou seja, o algoritmo de resolu¸c˜ao, possa ser gerado totalmente caso a caso.

A primeira etapa deste processo, apesar de n˜ao ser obrigat´oria, ´e motivada pelo bom senso e por boas pr´aticas de programa¸c˜ao: o ajuste e consequente otimiza¸c˜ao do estˆencil, fazendo-o utilizar somente o espa¸co de mem´oria necess´ario para o c´alculo dos pontos. Para isso ´e utilizado o mesmo princ´ıpio de busca de padr˜oes e substitui¸c˜ao da etapa 2 e, nesse caso, ´e feita uma busca com uso do Regex por “u[...]”, que ´e transformado em “u[(...) % 3]”. Isso ´e feito somente no indexamento do tempo e garante uma aloca¸c˜ao de mem´oria bem menor que no caso onde isso n˜ao ´e feito.

A segunda etapa consiste em usar o SymPy para criar as declara¸c˜oes das vari´aveis utilizadas no algoritmo, e cria-se os ciclos “for”que iteram sobre o tempo e sobre os pontos da grade espacial, de modo que o resultado final seja basicamente aquele produzido pelo Devito.

Por ´ultimo, usa-se o SymPy para construir a fun¸c˜ao propriamente dita que cont´em o algoritmo. Nesta ´ultima etapa foi encontrado um obst´aculo, pois o c´odigo gerado pelo Devito manda um objeto de um tipo particular (dataobj) e o primeiro comando da fun¸c˜ao ´e a inicializa¸c˜ao de um vetor com base no parˆametro desse objeto particular. E isso tudo, somado `a keyword “restricted”e o operador de seta (− >), ´e sofisticado demais para ser gerado pelo SymPy, portanto foi necess´ario simplificar a manipula¸c˜ao de dados.

Essa simplifica¸c˜ao consistiu em reestruturar a fun¸c˜ao principal do algoritmo e a estru- tura de dados que cont´em os valores de problema de modo que toda a fun¸c˜ao do algoritmo pudesse ser criada com uso do SymPy e de seus objetos. Essa cria¸c˜ao, junto das etapas descritas acima, s˜ao confinadas a uma classe no c´odigo denominada “Generator”.

No fim das contas, essa reestrutura¸c˜ao da fun¸c˜ao rendeu um template final incrivel- mente simples, onde o ´unico c´odigo literal ´e o header e a main, enquanto a fun¸c˜ao de resolu¸c˜ao de equa¸c˜ao ´e completamente gerada, sendo substitu´ıda no template pelo ele- mento {{solver}}.

Abaixo encontram-se, respectivamente, o template e a fun¸c˜ao gerada:

#i n c l u d e ” s t d l i b . h” #i n c l u d e ”math . h”

{{ s o l v e r }}

i n t main ( ) {

d o u b l e myarray [ { { params . u s h a p e [ 0 ] } } ] [ { { params . u s h a p e [ 1 ] } } ] [ { { params . u s h a p e [ 2 ] } } ] = {{ params . u d a t a } } ;

S o l v e r ( { { params . dt } } , {{ params . s t e p x } } , {{ params . s t e p y } } , myarray , {{ params . max time } } , {{ params . m i n t i m e } } , {{ params . max x } } , {{ params . min x } } ,

{{ params . max y } } , {{ params . min y } } ) ;

r e t u r n 0 ; } i n t S o l v e r ( d o u b l e dt , d o u b l e h x , d o u b l e h y , d o u b l e u [ 3 ] [ 2 1 ] [ 2 1 ] , i n t time M , i n t time m , i n t x M , i n t x m , i n t y M , i n t y m ) { i n t t ; i n t x ; i n t y ; f o r ( t = time m ; t < time M ; t += 1 ) { f o r ( x = x m ; x < x M ; x += 1 ) { f o r ( y = y m ; y < y M ; y += 1 ) { u [ ( t + 1 ) % 3 ] [ x ] [ y ] = 1 . 0 ∗pow( dt , 2 ) ∗ ( −2.0∗u [ ( t ) % 3 ] [ x ] [ y ] /pow( h y , 2 ) + u [ ( t ) % 3 ] [ x ] [ y − 1 ] /pow( h y , 2 ) + u [ ( t ) % 3 ] [ x ] [ y + 1 ] /pow( h y , 2 ) − 2 . 0 ∗ u [ ( t ) % 3 ] [ x ] [ y ] /pow( h x , 2 ) + u [ ( t ) % 3 ] [ x − 1 ] [ y ] /pow( h x , 2 ) + u [ ( t ) % 3 ] [ x + 1 ] [ y ] /pow( h x , 2 ) + 2 . 0 ∗ u [ ( t ) % 3 ] [ x ] [ y ] /pow( dt , 2 ) − 1 . 0 ∗ u [ ( t − 1 ) % 3 ] [ x ] [ y ] /pow( dt , 2 ) ) ; } ; } ; } ; }

7

TESTES E AVALIAC¸ ˜AO

Dado que a estrat´egia de desenvolvimento deste projeto conta, em grande parte, com uma engenharia reversa do Devito, ´e natural que um dos principais meios de valid´a-lo seja atrav´es de compara¸c˜oes diretas com o Devito em si, o que se d´a em dois n´ıveis.

O primeiro n´ıvel de compara¸c˜ao tem rela¸c˜ao com a forma do c´odigo C gerado, ou seja, compara-se se o algoritmo gerado possui os mesmos, ou equivalentes, ciclos “for”, encar- regados de percorrer todas as itera¸c˜oes necess´arias em todas as dimens˜oes do problema; e o mesmo, ou equivalente, centro do algoritmo, o estˆencil que, atrav´es do indexamento expl´ıcito de um vetor multidimensional, atualiza o valor em cada posi¸c˜ao do problema.

Analisando os c´odigos listados nos exemplos anteriores, ´e poss´ıvel perceber que eles s˜ao ligeiramente diferentes, mas, como explicado, essas diferen¸cas n˜ao acarretam em mudan¸ca de resultado desde que a fun¸c˜ao “Kernel” e “Solve” sejam chamadas com os parˆametros ajustados, tanto em rela¸c˜ao ao escopo das itera¸c˜oes que ser˜ao usados no indexamento, quanto em rela¸c˜ao `a estrutura de dados que armazena os valores referentes `a grade do problema.

Avaliar a forma do c´odigo, por´em, apenas sugere a possibilidade de compatibilidade entre as respostas de cada vers˜ao, fazendo com que seja necess´ario uma compara¸c˜ao efetiva entre os resultados obtidos em cada uma. O segundo n´ıvel de compara¸c˜ao ´e justamente esse e ele compara todos os valores finais armazenados no vetor.

Para efetuar esse teste, utilizou-se de um lado o c´odigo gerado pelo programa atrav´es do template, cuja vers˜ao final se encontra na subse¸c˜ao anterior, e de outro lado se utiliza a fun¸c˜ao “Kernel” gerada pelo Devito, junto de uma fun¸c˜ao main que cont´em exatamente os mesmos valores iniciais do problema. Esses valores, por sua vez, para que n˜ao fossem nulos como j´a comentado, foram inicializados atrav´es de uma fun¸c˜ao de exemplo do pr´oprio Devito. Esse m´etodo n˜ao precisa, e talvez nem deva, ser utilizado para inicializar os valores, podendo-se optar por qualquer outro meio, seja atribuindo valores literais no c´odigo, seja lendo de um arquivo, mas a t´ıtulo de exemplo, segue o m´etodo usado:

from e x a m p l e s . c f d import i n i t s m o o t h

i n i t s m o o t h ( f i e l d =u . d a t a [ 0 ] , dx=g r i d . s p a c i n g [ 0 ] , dy=g r i d . s p a c i n g [ 1 ] ) i n i t s m o o t h ( f i e l d =u . d a t a [ 1 ] , dx=g r i d . s p a c i n g [ 0 ] , dy=g r i d . s p a c i n g [ 1 ] )

Assim, temos uma grade inicial cujos valores no primeiro passo de tempo correspondem aos da figura 7, que foi desenhada com a fun¸c˜ao do Devito:

from e x a m p l e s . c f d import p l o t f i e l d p l o t f i e l d ( u . d a t a [ 0 ] )

Figura 7: Representa¸c˜ao da condi¸c˜ao inicial da grade de u no primeiro passo de tempo

Dada a configura¸c˜ao inicial do problema, foi poss´ıvel chamar as respectivas fun¸c˜oes de resolu¸c˜ao com os devidos parˆametros que lhes garantem equivalˆencia no tocante `as itera¸c˜oes realizadas e `a estrutura de dados que armazena os valores. Essas chamadas, localizadas na main, foram:

K e r n e l ( 0 . 0 2 , 0 . 0 5 , 0 . 0 5 , &u v e c , 1 0 1 , 1 , 1 7 , 0 , 1 7 , 0 ) ;

S o l v e r ( 0 . 0 2 , 0 . 0 5 , 0 . 0 5 , myarray , 1 0 2 , 1 , 2 0 , 2 , 2 0 , 2 ) ;

Em seguida, para se comparar os valores resultantes de tais chamadas, simplesmente foi adicionado nos c´odigos uma pequena rotina para salvar os resultados em arquivos se- parados. A adi¸c˜ao dessa rotina foi feita `a m˜ao apenas para a demonstra¸c˜ao dos resultados, n˜ao constando no template de gera¸c˜ao de c´odigo.

Finalmente, quando se compila e se executa o arquivo gerado (contendo, tamb´em, a rotina das respostas adicionada `a m˜ao), e o arquivo que combina a fun¸c˜ao “Kernel” do Devito com uma main e a rotina, obt´em-se dois arquivos contendo as respostas, um nomeado “myOutput” para os resultados que se deseja validar, e outro nomeado “answers” para os resultados esperados. Ambos os arquivos est˜ao no formato:

. . .

u [ 1 ] [ 3 ] [ 1 3 ] 0 . 2 5 8 8 7 9 u [ 1 ] [ 3 ] [ 1 4 ] 0 . 0 4 8 7 2 1

u [ 1 ] [ 3 ] [ 1 5 ] −0.003954 . . .

Para se comparar todos os valores gerados, foi escrita uma pequena rotina em Python que itera sobre cada linha de cada arquivo comparando-as uma a uma. O retorno dessa rotina foi:

P e r c e n t a g e o f c o r r e c t a n s w e r s : 100.0% ( 1 3 2 3 / 1 3 2 3 ) ´

E preciso dizer, por´em, que a compara¸c˜ao entre os resultados foi feita com uma margem de erro, onde se aceitava como igual aqueles valores com uma diferen¸ca menor que 0.00001. No caso de se comparar os valores exatos, o resultado obtido ´e pior (65%), dado que pequenas diferen¸cas na ordem dos c´alculos executados pelo estˆencil em cada vers˜ao podem acarretar em leves diferen¸cas no resultado final.

No fim das contas, como os resultados s˜ao praticamente iguais, foi feito o desenho da grade na ´ultima itera¸c˜ao do tempo apenas uma vez, mostrado na figura 8 apenas para efeitos de ilustra¸c˜ao:

Figura 8: Representa¸c˜ao da condi¸c˜ao final da grade de u no ´ultimo passo de tempo

Esse resultado, portanto, valida a equivalˆencia de funcionamento entre a fun¸c˜ao gerada pelo Devito e pelo projeto aqui desenvolvido. Apesar de ligeiramente diferentes, ambos os c´odigos produzem os mesmos resultados somente na condi¸c˜ao de serem executados o mesmo n´umero de itera¸c˜oes sobre cada dimens˜ao do problema, ou seja, apenas (e logica-

mente) na condi¸c˜ao de se executarem os mesmos c´alculos o mesmo n´umero de vezes, o que pode ser feito com chamadas de fun¸c˜ao ajustadas para cada vers˜ao.

Por outro lado, e apesar desse ´otimo resultado, n˜ao se pode omitir que quando se obt´em os valores da grade usando o objeto “Operator” do Devito, e n˜ao atrav´es de um c´odigo que usa a fun¸c˜ao por ele gerada, os resultados s˜ao significativamente piores. Caso se use a mesma tolerˆancia de 0.00001, a taxa de acerto fica 18%. Caso se use uma tolerˆancia de 0,1, a porcentagem de acerto fica 22%. S´o uma tolerˆancia de 1 deixa a taxa de acerto aceit´avel (88%).

O motivo dessa enorme discrepˆancia ´e desconhecido, mas provavelmente acontece por conta de alguma diferen¸ca no escopo das itera¸c˜oes realizadas internamente pelo Devito. Infelizmente, n˜ao se pˆode ir mais a fundo nas causas reais desse problema, pois o Devito tem um funcionamento de dif´ıcil compreens˜ao em certos aspectos, assemelhando-se a uma caixa preta, e isso evidencia mais uma vez a necessidade que tamb´em ´e meta deste projeto de se desvencilhar do Devito, proporcionando uma solu¸c˜ao semelhante, mas de f´acil compreens˜ao, utiliza¸c˜ao, integra¸c˜ao, e evolu¸c˜ao.

Por fim, para mostrar que, apesar das diferen¸cas consider´aveis, os resultados ainda s˜ao razoavelmente compat´ıveis, a figura 9 ilustra a grade gerada pelo “Operator”, que se assemelha `a figura anterior.

8

CONSIDERAC¸ ˜OES FINAIS

8.1

Conclus˜oes do Projeto de Formatura

Uma an´alise retrospectiva do que foi e n˜ao foi atingido ao longo do projeto deve avaliar, em um plano mais gen´erico, se a proposta que intitula o projeto foi de fato implementada, e em um plano mais espec´ıfico, se cada grande passo de desenvolvimento definido no planejamento foi realmente alcan¸cado.

O tema central do projeto ´e a “gera¸c˜ao de c´odigo C para a resolu¸c˜ao de equa¸c˜oes de onda representadas em uma DSL atrav´es do m´etodo de diferen¸cas finitas”, e para explicar se e em que medida isso foi atingido ´e necess´ario decompor o t´ıtulo em peda¸cos menores, os quais se encaixam propositalmente bem nos passos definidos no planejamento.

O primeiro passo, no t´ıtulo “[...] equa¸c˜oes de onda representadas em uma DSL [...]”, n˜ao se trata propriamente de uma nova implementa¸c˜ao que devesse ser realizada, mas sim de uma tarefa essencial e preliminar para dar in´ıcio ao problema, para formalizar a parte matem´atica do problema.

A grande quest˜ao aqui se resumiu a escolher o modelo de equa¸c˜ao de onda que seria utilizado e representa-lo usando uma DSL. E isso, como demonstrado, foi executado sem grandes problemas, de forma simples e direta. A equa¸c˜ao escolhida foi a cl´assica equa¸c˜ao de onda, e sua representa¸c˜ao na DSL do Devito ´e suficientemente intuitiva, a ponto de ser facilmente reproduzida ou alterada para expressar equa¸c˜oes mais complexas.

Ainda neste primeiro passo, abordou-se parte da quest˜ao da “resolu¸c˜ao [...] atrav´es do m´etodo de diferen¸cas finitas”, pois al´em de se representar a equa¸c˜ao de forma simb´olica, o Devito fornece os meios de se representar o estˆencil que resolve a equa¸c˜ao por diferen¸cas finitas, o que novamente se d´a de modo simples e direto.

O segundo passo se refere `a tradu¸c˜ao da DSL com o SymPy, o que faz evidente re- ferˆencia `a representa¸c˜ao da equa¸c˜ao. A tradu¸c˜ao final alcan¸cada pelo analisador sint´atico desenvolvido ´e gen´erica o suficiente para se aplicar a outras equa¸c˜oes diferenciais parciais, de modo que o problema original pode ser alterado e expandido com pouca ou nenhuma dificuldade.

Por´em, ainda que o Parser criado permita trabalhar com uma maior gama de proble- mas, a gera¸c˜ao de c´odigo ainda n˜ao igualou tal abrangˆencia. Esse aspecto da “gera¸c˜ao do c´odigo C para a resolu¸c˜ao de equa¸c˜oes [...]” ´e tratado pelo terceiro e quarto passos em diferentes graus de complexidade.

O c´odigo gerado pela terceira parte garante apenas que um c´odigo compil´avel possa de fato ser produzido pela aplica¸c˜ao, mesmo que esse c´odigo seja majoritariamente est´atico,

ou seja, escrito literalmente no template. Apesar disso, esse c´odigo assegura a correta transferˆencia dos dados criados no c´odigo Python para o c´odigo C.

J´a o c´odigo gerado pela quarta parte almeja tornar o c´odigo gerado o mais flex´ıvel poss´ıvel, possibilitando a resolu¸c˜ao de equa¸c˜oes que necessitem de algoritmos ligeiramente diferentes caso a caso.

Foi apenas nessa ´ultima etapa onde n˜ao foi poss´ıvel atingir um alto n´ıvel de imple- menta¸c˜ao, dada a brevidade de tempo dispon´ıvel para um desenvolvimento completo. O que foi desenvolvido ´e limitado quanto `as formas de equa¸c˜ao que teriam um algoritmo de resolu¸c˜ao gerado corretamente, e isso se d´a por dois motivos. Primeiro, a gera¸c˜ao de c´odigo n˜ao consegue lidar com 3 dimens˜oes espaciais, dado que nesse caso ela deveria incluir um novo ciclo de itera¸c˜ao sobre a dimens˜ao z, o que ela n˜ao faz; segundo, a gera¸c˜ao de c´odigo n˜ao suporta estˆenceis de ordens diferentes, dado que eles acarretam em uma mudan¸ca no n´umero de pontos usados para se calcular o ponto em quest˜ao. Esse comportamento leva, por conta de mudan¸cas no indexamento, a uma mudan¸ca nos limites das itera¸c˜oes em cada dimens˜ao e, tamb´em, pode invalidar a otimiza¸c˜ao de espa¸co de mem´oria na dimens˜ao do tempo, que usa apenas 3 pontos. Contudo, foi poss´ıvel, sim, gerar um c´odigo em grande parte dinˆamico, produzido especificamente para equa¸c˜oes diferenciais parciais de segunda ordem, dado que suas solu¸c˜oes obedecem um algoritmo uniforme. Al´em disso, todas essas limita¸c˜oes descritas s˜ao razoavelmente simples de serem implementadas com um tempo de desenvolvimento adequado.

Retrospectivamente, ´e poss´ıvel afirmar que o que foi implementado fornece os meios para representar uma equa¸c˜ao de onda com uma DSL, para resolve-la usando o m´etodo de diferen¸cas finitas, e para gerar o c´odigo C que a resolve, cumprindo todas as exigˆencias do tema principal. O que foi proposto, ent˜ao, foi plenamente atingido, com a ressalva de que n˜ao se atingiu um grau de complexidade e abrangˆencia muito altos, mas suficientes, e aquilo que foi atingido foi validado por testes coerentes. Al´em disso, o presente docu- mento em si serve m´ultiplos prop´ositos: ele contempla de forma organizada e sintetizada o vasto campo de contextualiza¸c˜ao do problema em quest˜ao, introduzindo o leitor ao complexo problema de imageamento s´ısmico e muito do que lhe ´e impl´ıcito; ele contempla uma descri¸c˜ao direcionada das principais ferramentas utilizadas, conduzindo o leitor `as funcionalidades de maior interesse na vasta documenta¸c˜ao do SymPy e Devito; e, claro, ele contempla a descri¸c˜ao minuciosa e, espera-se, did´atica do projeto em si, possibilitando o leitor de fazer uma transi¸c˜ao sem grandes esfor¸cos para uma outra aplica¸c˜ao, e de dar continuidade ao projeto, evoluindo a complexidade e abrangˆencia que ainda lhe faltam.

8.2

Contribui¸c˜oes

Ficou evidente ao longo deste documento que o projeto tem fortes ra´ızes no SymPy e no Devito, fazendo uso essencial de in´umeras de suas funcionalidades para atingir uma meta que, de um modo ou de outro, j´a ´e realizada pelo Devito, que por sua vez faz grande uso do SymPy. Neste projeto, portanto, n˜ao foi criada e desenvolvida uma maneira original de lidar com express˜oes simb´olicas, ou de representar equa¸c˜oes matem´aticas.

Aquilo que foi propriamente criado neste projeto foi um analisador sint´atico que tra- duz as express˜oes simb´olicas descritas com a DSL do Devito para express˜oes simb´olicas pr´oprias do SymPy e, em seguida, para sua forma representativa em c´odigo C. Em outras palavras, esse projeto possibilita que determinados problemas matem´aticos que envolvem equa¸c˜oes diferenciais parciais, e que foram facilmente formalizados em alto n´ıvel com a conveniˆencia do Devito, possam ser transformados em seu formato de baixo n´ıvel em linguagem C atrav´es do SymPy.

Como j´a mencionado, essa mesma fun¸c˜ao j´a ´e executada pelo pr´oprio Devito, com a diferen¸ca que ele busca fazer otimiza¸c˜oes computacionais no c´odigo gerado. Aqui, por´em, almejava-se justamente suprimir essas otimiza¸c˜oes, deixando-a a cargo de especialistas que podem execut´a-las especificamente para o hardware e para o problema em quest˜ao.

Isso acarreta na segunda contribui¸c˜ao do projeto, que foi, atrav´es de uma engenharia reversa do Devito, proporcionar uma solu¸c˜ao paralela para o problema da resolu¸c˜ao de equa¸c˜oes de onda na forma de um algoritmo em c´odigo C. ´E esse resultado que permitir´a o uso do que foi aqui desenvolvido em aplica¸c˜oes da ´area de modelagem e simula¸c˜ao de modelos s´ısmicos. ´E esse o produto que pode ser inserido em outros contextos e otimizado conforme os requisitos espec´ıficos de outros problemas.

Finalmente, deve-se adicionar que o c´odigo e a documenta¸c˜ao produzidos contribuem para o di´alogo entre as diferentes partes envolvidas em projetos de imageamento s´ısmico. Espera-se, assim, que f´ısicos, matem´aticos, ge´ologos, e programadores, possam ser bene- ficiados em rela¸c˜ao ao seu conhecimento do problema, `a sua comunica¸c˜ao de ideias, e `as suas solu¸c˜oes de problemas.

8.3

Perspectivas de Continuidade

Resta, finalmente, recapitular aquilo que pode ser melhorado e/ou evolu´ıdo neste projeto e o primeiro passo l´ogico ´e analisar o que foi apenas parcialmente atingido.

´

E evidente, ent˜ao, a possibilidade de evolu¸c˜ao do quarto grande passo determinado no planejamento. Sua implementa¸c˜ao ideal possibilitaria que qualquer equa¸c˜ao diferencial parcial fosse resolvida atrav´es de um c´odigo que foi gerado para aquele caso espec´ıfico,

n˜ao importa o grau da equa¸c˜ao e a ordem de seu estˆencil.

Um segundo ponto com clara possibilidade de evolu¸c˜ao seria a complexidade da en- trada do problema. No estado atual, lida-se apenas com uma equa¸c˜ao de onda, como foi proposto, e nada mais. Em um estado mais avan¸cado, seria esperado que o pro- grama possu´ısse a capacidade de se adequar para modelos s´ısmicos completos, formali- zados atrav´es de uma express˜ao matem´atica que inclu´ısse as fontes das ondas sonoras, os receptores de seus reflexos, condi¸c˜oes de borda, e geometrias mais complexas. Isso, logicamente, acarretaria em grandes mudan¸cas no c´odigo gerado, dado que o algoritmo de resolu¸c˜ao dever´a levar em conta todos esses aspectos mais complexos. O analisador sint´atico, por´em, provavelmente precisaria de mudan¸cas menos dr´asticas j´a que ele ´e en- carregado de traduzir aspectos que j´a s˜ao comuns ao problema atual e a este problema futuro hipot´etico.

Sintetizando o que foi descrito, seria poss´ıvel incrementar e evoluir o projeto atual para um estado em que ele se assemelhe ao Devito com rela¸c˜ao `a abrangˆencia de problemas s´ısmicos que ele suporta, apesar de resolvˆe-los `a sua maneira e n˜ao contemplar otimiza¸c˜oes computacionais.

REFERˆENCIAS

1 ONAJITE, E. Chapter 2 - understanding seismic wave propagation. In: ONAJITE, E. (Ed.). Seismic Data Analysis Techniques in Hydrocarbon Exploration. Oxford: Elsevier, 2014. p. 17 – 32. ISBN 978-0-12-420023-4.

2 ONAJITE, E. Chapter 13 - understanding seismic interpretation methodology. In: ONAJITE, E. (Ed.). Seismic Data Analysis Techniques in Hydrocarbon Exploration. Oxford: Elsevier, 2014. p. 177 – 211. ISBN 978-0-12-420023-4.

3 ONAJITE, E. Chapter 3 - understanding seismic exploration. In: ONAJITE, E. (Ed.). Seismic Data Analysis Techniques in Hydrocarbon Exploration. Oxford: Elsevier, 2014. p. 33 – 62. ISBN 978-0-12-420023-4.

4 VIRIEUX, J.; OPERTO, S. An overview of full-waveform inversion in exploration geophysics. Geophysics, Society of Exploration Geophysicists, v. 74, n. 6, p.

WCC1–WCC26, 2009.

5 CARCIONE, J.; HERMAN, G.; KROODE, A. ten. Seismic modeling: Geophysics. [S.l.]: GPYSA7, 2002.

6 BIEZUNER, R. J. Equa¸c˜oes diferenciais parciais i/ii. 2011.

7 LANGTANGEN, H. P. Finite Difference Computing with Exponential Decay Models. [S.l.]: Springer Nature, 2016.

8 YOUNT, C. et al. Yask—yet another stencil kernel: A framework for hpc stencil code- generation and tuning. In: IEEE. 2016 Sixth International Workshop on Domain-Specific Languages and High-Level Frameworks for High Performance Computing (WOLFHPC). [S.l.], 2016. p. 30–39.

9 DEURSEN, A. V.; KLINT, P. Domain-specific language design requires feature descriptions. Journal of computing and information technology, SRCE-Sveuˇciliˇsni raˇcunski centar, v. 10, n. 1, p. 1–17, 2002.

10 LANGE, M. et al. Devito: Towards a generic finite difference dsl using symbolic

Documentos relacionados