Laboratório 6 - Simulação Numérica de Fluidos em 1D
Objetivo
Implementar estruturas de repetição e manipular vetores na memória utilizando instruções da arquitetura Assembly RISC-V.
Motivação
Pilares da mecânica dos fluidos, as equações de Navier-Stokes descrevem o fluxo de líquidos e gases. Para simular estas equações, os computadores exigem a discretização do espaço e do tempo, o que deixa em aberto a possibilidade de surgirem instabilidades ou singularidades numéricas. Provar matematicamente se o escoamento tridimensional contínuo evita ou não esses infinitos é, precisamente, um dos Problemas do Milénio. Apesar dos avanços propostos recentemente com o auxílio de modelos de inteligência artificial, o problema continua relevante na busca de mecanismos para otimizar a computação de simulações de fluidos.
Neste laboratório, será explorada uma versão simplificada da mesma ideia: transformar um modelo de fluidos num algoritmo discreto e implementá-lo de forma eficiente.
Modelo Simplificado de Difusão em Fluidos
Considerando uma versão simplificada do comportamento de um fluido ao longo de uma única dimensão, em vez de trabalhar diretamente com as equações completas de Navier-Stokes, vamos considerar apenas o efeito de difusão, que representa a tendência de uma diferença de velocidade se espalhar ao longo do fluido.
O espaço é dividido em posições discretas. Cada posição i contém um valor de velocidade v[i]. Em cada passo da simulação, o novo valor de velocidade de uma posição depende do seu próprio valor e dos valores das duas posições vizinhas:
v'[i] = v[i] + (v[i-1] + v[i+1] - 2*v[i]) / 4
Se a velocidade de uma posição for muito diferente da média das posições vizinhas, essa diferença será maior e a velocidade será alterada mais rapidamente. Para evitar operações de ponto flutuante, a divisão por 4 pode ser realizada utilizando um deslocamento de bits.
A cada iteração, esta operação é aplicada a todas as posições do vetor. Ao repetir o processo, as diferenças de velocidade tendem a diminuir e a distribuição torna-se progressivamente mais uniforme.
Para evitar que o cálculo de uma posição utilize valores que já foram atualizados na mesma iteração, devem ser utilizados dois vetores: um contendo o estado atual da simulação e outro para armazenar o novo estado.
As posições nas extremidades do vetor constituem um caso especial, pois possuem apenas um vizinho. Para simplificar a implementação, podemos considerar que os valores das extremidades permanecem constantes durante toda a simulação.
Tip
A entrada é composta por duas linhas: a primeira contém um número inteiro de zero a noventa e nove, formatado com dois dígitos (preenchido com zero à esquerda se necessário), e a segunda contém uma lista de números inteiros, também formatados com dois dígitos, separados por espaço. A saída consiste em uma única linha contendo a lista resultante no mesmo formato de dois dígitos com zero à esquerda, separados por espaço.
Código Base
# ============================================================
# 1D Fluid Diffusion - RV32I
#
# Formula:
# difference = left + right - 2 * center
# change = difference >> 2
# new_value = center + change
#
# The first and last elements remain unchanged.
# All test cases have a number of elements >= 3.
# ============================================================
# Constants Definition
.equ MAX_SHAPE, 128
.equ MAX_INPUT, MAX_SHAPE * 3
# ============================================================
# Data Segment
.data
main_buffer: .space MAX_SHAPE * 4
aux_buffer: .space MAX_SHAPE * 4
input_buffer: .space MAX_INPUT
output_buffer: .space MAX_INPUT
# ============================================================
# Code Segment
.text
.globl _start
_start:
# read from Linux stdin
jal read_input_procedure
# Return: array, n, iterations
# execute a diffusion_1d
# Uses: array, n, iterations
jal diffusion_1d
# write on Linux stdout
# Uses: array, n
jal write_input_procedure
# syscall exit
li a0, 0
li a7, 93
ecall
Exemplos
Base Case
01
10 20 30 40 50
--------------
10 20 30 40 50
Convergence
10
00 99 00 99 00 99 00
--------------------
00 15 26 30 26 15 00
Minimum Vector
05
10 50 90
--------
10 50 90
Zero Iterations
00
12 34 56 78
-----------
12 34 56 78
Uniform Values
05
42 42 42 42 42
--------------
42 42 42 42 42
Entrega
O report gerado pelo simulador deve ser submetido no Classroom da disciplina, renomeado para {RA}_lab6.report.
Warning
- Qualquer alteração no arquivo de report será considerado fraude
- O uso de ferramentas de IA deve ser reportado, indicando como foi utilizado e em quais partes do código.
- Está é uma atividade individual, o qual deve ser desenvolvido individualmente, qualquer forma de cópia ou plágio será penalizada. Portanto, atividades que apresentarem semelhanças injustificadas serão atribuídas nota zero para todos os envolvidos