You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
simulacion-permeabilidad/fftma_module/gen/lib_src/chunk_array.c

204 lines
6.6 KiB
C

#include "chunk_array.h"
#include "stdbool.h"
/*
void chunk_array_free(chunk_array_t* chunk_array) {
fclose(chunk_array->fp);
free(chunk_array->data);
free(chunk_array);
}
bool chunk_array_update(chunk_array_t* chunk_array, size_t pos) {
int init_pos = pos/chunk_array->chunk_size;
fseek(chunk_array->fp, init_pos * chunk_array->chunk_size * sizeof(double), SEEK_SET);
chunk_array->init_pos = init_pos;
}
bool chunk_array_update_read(chunk_array_t* chunk_array, size_t pos) {
chunk_array_update(chunk_array, pos);
size_t newLen = fread(chunk_array->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp);
chunk_array->init_pos += newLen;
}
/*bool chunk_array_get(chunk_array_t* chunk_array, size_t pos, double *valor) {
if (pos<chunk_array->init_pos || pos>((chunk_array->init_pos + chunk_array->chunk_size)-1)) {
chunk_array_update_read(chunk_array, pos);
}
*valor=chunk_array->data[pos%chunk_array->chunk_size];
return true;
}
bool chunk_array_save(chunk_array_t* chunk_array, size_t pos, double valor) {
if (pos<chunk_array->init_pos || pos>((chunk_array->init_pos + chunk_array->chunk_size)-1)) {
chunk_array_flush(chunk_array);
chunk_array_update(chunk_array, pos);
}
chunk_array->data[pos%chunk_array->chunk_size]=valor;
return true;
}
chunk_array_t* chunk_array_create(char* filename, size_t total_size, size_t chunk_size) {
chunk_array_t* chunk_array = (chunk_array_t*)malloc(sizeof(chunk_array_t));
chunk_array->fp = fopen(filename, "w+");
if (chunk_array == NULL || chunk_array->fp == NULL) {
return NULL;
}
chunk_array->data = malloc(chunk_size * sizeof(double));
if (chunk_size > 0 && chunk_array->data == NULL) {
free(chunk_array);
return NULL;
}
chunk_array->init_pos = 0;
chunk_array->chunk_size = chunk_size;
chunk_array->total_size = total_size;
return chunk_array;
}
void chunk_array_read(chunk_array_t* chunk_array) {
rewind(chunk_array->fp);
chunk_array->init_pos = 0;
size_t newLen = fread(chunk_array->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp);
}
void chunk_array_write(chunk_array_t* chunk_array, char* filename) {
chunk_array->fp = fopen(filename, "w");
if (chunk_array->fp == NULL) {
fclose(chunk_array->fp);
chunk_array->fp = fopen(filename, "w");
}
chunk_array->init_pos = 0;
}
void chunk_array_flush(chunk_array_t* chunk_array) {
size_t newLen = fwrite(chunk_array->data, sizeof(double), chunk_array->chunk_size, chunk_array->fp);
chunk_array->init_pos += newLen;
}
bool chunk_array_get(chunk_array_t* chunk_array, size_t pos, double *valor) {
fseek(chunk_array->fp, pos * sizeof(double), SEEK_SET);
fread(valor, sizeof(double), 1, chunk_array->fp);
return true;
}
bool chunk_array_save(chunk_array_t* chunk_array, size_t pos, double valor) {
fseek(chunk_array->fp, pos * sizeof(double), SEEK_SET);
fwrite(&valor, sizeof(double), 1, chunk_array->fp);
return true;
}
*/
void chunk_array_free(chunk_array_t* chunk_array) {
fclose(chunk_array->fp);
free(chunk_array->read_data);
free(chunk_array->write_data);
free(chunk_array);
}
void chunk_array_flush(chunk_array_t* chunk_array) {
//printf("[FLUSH][%s] init_write %d\n", chunk_array->filename, chunk_array->init_write);
size_t mod;
if (chunk_array->total_size - chunk_array->init_write > chunk_array->chunk_size ) {
mod = chunk_array->chunk_size;
} else {
mod = chunk_array->total_size - chunk_array->init_write;
//printf("[FLUSH] ACA mod = %d\n", mod);
}
fseek(chunk_array->fp, chunk_array->init_write * sizeof(double), SEEK_SET);
fwrite(chunk_array->write_data, sizeof(double), mod, chunk_array->fp);
}
bool chunk_array_update(chunk_array_t* chunk_array, size_t pos) {
chunk_array_flush(chunk_array);
int new_init = pos/chunk_array->chunk_size;
chunk_array->init_write = new_init * chunk_array->chunk_size;
//printf("[UPDATE] pos = %d new_init = %d\n", pos, chunk_array->init_write);
fseek(chunk_array->fp, chunk_array->init_write * sizeof(double), SEEK_SET);
fread(chunk_array->write_data, sizeof(double), chunk_array->chunk_size, chunk_array->fp);
}
chunk_array_t* chunk_array_create(char* filename, size_t total_size) {
chunk_array_t* chunk_array = (chunk_array_t*)malloc(sizeof(chunk_array_t));
chunk_array->fp = fopen(filename, "r+");
if (chunk_array == NULL || chunk_array->fp == NULL) {
chunk_array->fp = fopen(filename, "w+");
if (chunk_array->fp == NULL) {
return NULL;
}
}
chunk_array->write_data = malloc(MAX_CHUNK_SIZE * sizeof(double));
if (MAX_CHUNK_SIZE > 0 && chunk_array->write_data == NULL) {
free(chunk_array);
//free(chunk_array->read_data);
return NULL;
}
fread(chunk_array->write_data, sizeof(double), MAX_CHUNK_SIZE, chunk_array->fp);
chunk_array->filename = filename;
chunk_array->init_read = 0;
chunk_array->init_write = 0;
chunk_array->chunk_size = MAX_CHUNK_SIZE;
chunk_array->total_size = total_size;
return chunk_array;
}
bool chunk_array_get(chunk_array_t* chunk_array, size_t pos, double *valor) {
if (pos<chunk_array->init_write || pos>chunk_array->init_write + chunk_array->chunk_size-1) {
//printf("[READ][%s] actualizo pos = %d init_write = %d\n",chunk_array->filename, pos, chunk_array->init_write);
chunk_array_update(chunk_array, pos);
}
size_t mod;
if (chunk_array->total_size - chunk_array->init_write > chunk_array->chunk_size ) {
mod = chunk_array->chunk_size;
} else {
mod = chunk_array->total_size - chunk_array->init_write;
}
int real_pos = pos%mod;
*valor=chunk_array->write_data[real_pos];
//printf("[READ] %s[%d] = %f = chunk[%d] init_write = %d\n", chunk_array-> filename, pos, *valor, real_pos, chunk_array->init_write);
return true;
}
bool chunk_array_save(chunk_array_t* chunk_array, size_t pos, double valor) {
if (pos<chunk_array->init_write || pos>chunk_array->init_write + chunk_array->chunk_size-1) {
//printf("[WRITE][%s] actualizo pos = %d init_write = %d\n",chunk_array->filename, pos, chunk_array->init_write);
chunk_array_update(chunk_array,pos);
}
size_t mod;
if (chunk_array->total_size - chunk_array->init_write > chunk_array->chunk_size ) {
mod = chunk_array->chunk_size;
} else {
mod = chunk_array->total_size - chunk_array->init_write;
//printf("[WRITE] ACA mod = %d\n", mod);
}
chunk_array->write_data[pos%mod]=valor;
//printf("[WRITE] %s[%d] = %f\n", chunk_array-> filename, pos, valor);
return true;
}