Todos os cálculos realizados pelos métodos numéricos são inseridos no
para posteriormente serem analisados e ou mostrados na tela.
Primeiramente o log foi implementado como uma lista ligada de vetores
de estados mas percebeu-se que muito tempo de processamento poderia ser
perdido somente com a aloção de espaço na memória assim como espaço
perdido por ponteiros.
A implementação adotada foi uma lista duplamente ligada de matrizes,
cada elemento da lista foi chamado de , estes contém uma matriz
(dados do vôo) e os ponteiros para os elementos seguintes e
anteriores.
As linhas das matrizes representam o tempo e as colunas as posições do
vetor de estados, o tamnho do vetor de estados é dado no momento da
criação do log. As Páginas do log são criadas dinamicamente quando o
usuário deseja calcular um determinado número de iterações dos métodos
numéricos, a página terá o tamanho do número de iterações escolhido.
O estrutura do log não armazena o método nem o passo que foi utilizado
para os cálculos, gerando problemas quando forem utilizados métodos de
passos variáveis, pois não saberemos dize qual passo foi utilizada no
cálculo a cada instante. A implemetação disto pode ser feita inserindo
novas váriaveis nas Páginas do para armazenar o passo e o método
que foram utilizados.
float var[][]; |
Page *next; |
Page *prev; |
long size; |
long max_size; |
A Estrutura do Log armazena alguns apontadores para páginas, tamanho total, tamanho do vetor e posição atual, são eles:
long n // numero total de elementos do log
long vector_size;
Page *begin;
Page *end;
Page *current; // referencia para pagina atual
long curr_offset; // offset da pagina atual
long curr_pos; // numero absoluto da posicao atual ( 1 to n)
Os últimos itens: ,
,
, estão relacionados à
manipulação do log, isto é, a posição que está o log em determinado
instante.
Interface para a utilização do Log :
Log *log_new(int vector_size);
int log_delete(Log *log);
Log *log_load(char *filename);
int log_save(Log *log, char *filename);
// Cria uma nova vazia de tamanho
para que possam
ser inseridos elementos
int log_alloc_space(Log *log, int n);
// insere um elemento, supõe-se que existe espaço alocado anteriormente
int log_insert_element(Log *log, float *var);
// insere um bloco (matriz) de elementos de tamanho n
// *** uma nova página é criada automaticamente ***
int log_insert_block(Log *log, float **vars, long n);
// retorna o elemento atual
float *log_current(Log *log);
// retorna o último elemento
float *log_get_end(Log *log);
// Retorna uma matriz com todos elementos do Log
// Matriz terá tamanho : n x vector_size
float **log_get_all(Log *log);
// Retorna uma matriz com elementos a apartir de
// Matriz terá tamanho : size x vector_size
float **log_get_block(Log *log, long begin, long size);
// Seta o elemento atual (apontador) para o início
float *log_to_begin(Log *log);
// Seta o elemento atual (apontador) para o fim
float *log_to_end(Log *log);
// Seta o elemento atual para o próximo
float *log_to_next(Log *log);
// Seta o elemento atual para o anterior
float *log_to_prev(Log *log);
// Seta o elemento atual para n elementos a frente do atual(current)
float *log_to_prev_n(Log *log, long dist);
// Seta o elemento atual para n elementos atrás do atual(current)
float *log_to_next_n(Log *log, long dist);
// Seta o elemento atual para a posição absoluta
float *log_to_pos(Log *log, long pos);
Todas funções de manipulação retornam um apontador para o novo
elemento atual, caso contrário.
,