gravidade-fortran

Gravidade, só que em Fortran.

https://github.com/potalej/gravidade-fortran

Science Score: 57.0%

This score indicates how likely this project is to be science-related based on various indicators:

  • CITATION.cff file
    Found CITATION.cff file
  • codemeta.json file
    Found codemeta.json file
  • .zenodo.json file
    Found .zenodo.json file
  • DOI references
    Found 3 DOI reference(s) in README
  • Academic publication links
  • Academic email domains
  • Institutional organization owner
  • JOSS paper metadata
  • Scientific vocabulary similarity
    Low similarity (1.9%) to scientific vocabulary
Last synced: 6 months ago · JSON representation ·

Repository

Gravidade, só que em Fortran.

Basic Info
Statistics
  • Stars: 0
  • Watchers: 1
  • Forks: 0
  • Open Issues: 5
  • Releases: 1
Created about 3 years ago · Last pushed 6 months ago
Metadata Files
Readme Citation

README.md

🪐 gravidade-fortran 🪐

A mesma gravidade, só que em Fortran. Vamo que vamo :)

⚙️ Compilando

Para gerar uma build com o gerador desejado, basta rodar

cmake -B build -G "gerador"

Por exemplo, usando o Ninja:

cmake -B build -G Ninja ninja -C build

Um executável será gerado no diretório raiz.

Outra possibilidade é com o uso dos helpers. Use:

sh helpers/build.sh

para compilar o programa. Se quiser compilar e rodar um exemplo de preset, use:

sh helpers/compilar_gerar.sh

🚩 Flags

Há duas flags disponíveis. A primeira é a PRECISAO, que pode ser 32, 64 (padrão) ou 128, e todas as variáveis de tipo REAL(pf) terão a precisão desejada. Exemplo de uso: cmake -B build -DPRECISAO=64 ...

A outra flag é a do gprof, que ativa o GNU Profiler, utilizado para análise de desempenho. Para ativar, basta usar: cmake -B build -DGPROF=ON ... Após rodar uma simulação com o programa compilado com gprof, será gerado um arquivo "gmon.out" que fornece um relatório usando o comando: gprof gravidade.exe gmon.out > relatorio.txt

🧮 Simulando

Presets para geração

É possível utilizar presets (i.e., arquivos com configurações pré-definidas) para gerar valores iniciais aleatórios com determinadas condições, como com uma energia total desejada, por exemplo.

Com base em um preset modelo disponível em "presets/", escreva seu preset e rode com:

./gravidade -s SEU_ARQUIVO.json

Há três modos para geração aleatória no momento, que geram valores iniciais aleatórios e os condicionam: - sorteio_ip_iterativo: Condicionamento iterativo; - sorteio_ip_direto: Condicionamento direto; - sorteio_aarseth: Condiciona diretamente e depois aplica o proposto por (Aarseth, 2003) para obter o equilíbrio de virial.

Confira aqui um exemplo de arquivo de valores para sorteio.

Valores iniciais

Se já tiver os valores iniciais do problema e quiser utilizá-los, é possível através da opção -vi. Um modelo de valores iniciais de um problema de três corpos com trajetória em formato de lemniscata está disponível no diretório PRESETs.

Para rodar este caso, utilize:

./gravidade -vi SEU_ARQUIVO.json

Confira aqui um exemplo de arquivo de valores iniciais.

Visualizando 🧐

É possível visualizar as simulações de duas formas.

Gnuplot ou Matplotlib

Através da opção -e ou --exibir. É uma visualização simples das trajetórias, mas pode ajudar a conferir resultados rapidamente.

./gravidade -e SEU_ARQUIVO.csv

Visualização em tempo real

Também podemos visualizar as simulações em tempo real via sockets, ativando a opção "exibir": true no arquivo de valores iniciais utilizado. Para isso, é preciso ter um servidor local aberto para receber as informações, que são enviadas via TCP.

Um exemplo de script em Python que recebe e exibe os dados em tempo real pode ser encontrado em aqui. Basta rodar este script e em seguida rodar sua simulação com a opção ativada. É importante observar que o envio de dados prejudica consideravelmente o desempenho, então não é bom usar isso para simulações grandes e sérias.

Exemplo de visualização em tempo real via socket

📈 Métodos

Os métodos de integração implementados são:

Também há três aplicações para modificar soluções:

  1. Um corretor numérico que aplica correções a partir dos desvios de energia total (e outras integrais primeiras). Bastante útil para simulações com muitos corpos;
  2. Colisões perfeitamente elásticas entre os corpos.
  3. Um amortecedor no potencial, que impede aproximações muito intensas. Para poucos corpos pode gerar instabilidades, mas é útil para grandes quantidades de corpos.

As massas, posições e momentos lineares são armazenados em arquivos .csv no diretório "data". Para evitar sobreescrita de dados, o nome do arquivo captura a data corrente no formato "aaaammdd_vv.csv", onde "v" se refere à versão do dia, iniciando em 001 e indo até 999.

A análise dos dados pode ser feita com Python através de gravidade-analise.

📚 Bibliotecas utilizadas

  • OpenBLAS: Rotinas numéricas de álgebra linear. Geralmente não é difícil de instalar, então está sendo importada manualmente.
  • JSON-Fortran: Rotinas para manipulação de arquivos JSON. Esta teve o "src" de sua versão 9.0.3 (fev/2025) disponibilizado localmente para facilitar o uso em diferentes máquinas, e seus arquivos estão no diretório "lib/json-fortran".

Referências

  • AARSETH, Sverre. Gravitational N-Body Simulations: Tools and Algorithms. Cambridge: Cambridge University Press, 2003.
  • VOLCHAN, Sérgio. Uma Introdução à Mecânica Celeste. Rio de Janeiro: Instituto Nacional de Matemática Pura e Aplicada - IMPA, 2007.
  • BERTSEKAS, Dmitri Panteli. Nonlinear Programming. 3ed. Nashua: Athena Scientific, 2016.
  • HAIRER, Ernst; WANNER, Gerhard; LUBICH, Christian. Geometric Numerical Integration: Structure-Preserving Algorithms for Ordinary Differential Equations. Heidelberg: Springer-Verlag, 2006. DOI: 10.1007/3-540-30666-8. Disponível em: https://doi.org/10.1007/3-540-30666-8.
  • ROMA, Alexandre et al. Métodos para a solução numérica de equações diferenciais ordinárias a valores iniciais. São Paulo: Notas de aula, 2019.
  • OKUNBOR, D. I.; SKEEL, R. D. Canonical Runge—Kutta—Nyström methods of orders five and six. Journal of Computational and Applied Mathematics, v. 51, n. 3, p. 375–382, jun. 1994.

Owner

  • Name: Potalej
  • Login: Potalej
  • Kind: user
  • Location: São Paulo ☂

🍕

Citation (CITATION.cff)

cff-version: 1.2.0
title: gravidade-fortran
message: >-
  Se for usar pra alguma coisa, cita o repositorio
  usando esse arquivo aqui.
type: software
authors:
  - given-names: Octavio Augusto Potalej
    email: oapotalej@usp.br
    affiliation: Universidade de São Paulo
repository-code: 'https://github.com/Potalej/gravidade-fortran'
abstract: >-
  Simulações do problema de N-corpos gravitacional em
  Fortran.

GitHub Events

Total
  • Issues event: 5
  • Issue comment event: 3
  • Push event: 37
  • Create event: 1
Last Year
  • Issues event: 5
  • Issue comment event: 3
  • Push event: 37
  • Create event: 1