tDebugging memory - ns2dfd - 2D finite difference Navier Stokes solver for fluid dynamics
 (HTM) git clone git://src.adamsgaard.dk/ns2dfd
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit 428ee066696d71e182801d30915c3ee16ea06e9b
 (DIR) parent 21beace0920e40917cfb89632dc3bb0387b2370a
 (HTM) Author: Anders Damsgaard <anders.damsgaard@geo.au.dk>
       Date:   Sun,  2 Mar 2014 11:33:22 +0100
       
       Debugging memory
       
       Diffstat:
         M src/Makefile                        |      13 +++++++++++++
         M src/file_io.c                       |      64 +++++++++++++++++++++++++++++++
         M src/main.c                          |      27 +++++++++++++++++++++++++++
         M src/utility.c                       |      49 +++++++++++++++++++------------
         M src/utility.h                       |       8 +++++---
       
       5 files changed, 140 insertions(+), 21 deletions(-)
       ---
 (DIR) diff --git a/src/Makefile b/src/Makefile
       t@@ -0,0 +1,13 @@
       +CFLAGS=-Wall -pedantic -g
       +
       +BIN=../ns2dfd
       +
       +$(BIN): main.o file_io.o utility.o
       +        $(CC) $(CFLAGS) $^ -o $@
       +
       +main.o: file_io.h utility.h
       +file_io.o: utility.h
       +
       +clean:
       +        $(RM) *.o
       +        $(RM) $(BIN)
 (DIR) diff --git a/src/file_io.c b/src/file_io.c
       t@@ -0,0 +1,64 @@
       +#include <stdio.h>
       +#include "utility.h"
       +
       +/* Read the variable values from a file on disk */
       +int read_file(char *path,
       +        double *t, double *t_end, double *tau, int *itermax,
       +        double *epsilon, double *omega, double *gamma,
       +        double *gx, double *gy, double *re,
       +        int *w_left, int *w_right, int *w_top, int *w_bottom,
       +        double *dx, double *dy,
       +        int *nx, int *ny,
       +        double **P, double **U, double **V)
       +{
       +    int i, j;
       +    double tmp;
       +    FILE *fp;
       +    if ((fp = fopen(path, "rb")) == NULL) {
       +        fprintf(stderr, "read_file: Could not open file %s\n", path);
       +        return 1;
       +    } else {
       +        fread(t, sizeof(double), 1, fp);
       +        fread(t_end, sizeof(double), 1, fp);
       +        fread(tau, sizeof(double), 1, fp);
       +
       +        fread(itermax, sizeof(int), 1, fp);
       +        fread(epsilon, sizeof(double), 1, fp);
       +        fread(omega, sizeof(double), 1, fp);
       +        fread(gamma, sizeof(double), 1, fp);
       +
       +        fread(gx, sizeof(double), 1, fp);
       +        fread(gy, sizeof(double), 1, fp);
       +        fread(re, sizeof(double), 1, fp);
       +
       +        fread(w_left, sizeof(int), 1, fp);
       +        fread(w_right, sizeof(int), 1, fp);
       +        fread(w_top, sizeof(int), 1, fp);
       +        fread(w_bottom, sizeof(int), 1, fp);
       +
       +        fread(dx, sizeof(double), 1, fp);
       +        fread(dy, sizeof(double), 1, fp);
       +        fread(nx, sizeof(int), 1, fp);
       +        fread(ny, sizeof(int), 1, fp);
       +
       +        allocate_memory(P, U, V, *nx, *ny);
       +        
       +        for (j=0; j<*ny+1; j++)
       +            for (i=0; i<*nx+1; i++) {
       +                fread(&tmp, sizeof(double), 1, fp);
       +                P[i][j] = tmp;
       +            }
       +                /*fread(P[i][j], sizeof(double), 1, fp);*/
       +
       +        for (j=0; j<*ny+2; j++)
       +            for (i=0; i<*nx+2; i++)
       +                fread(&U[i][j], sizeof(double), 1, fp);
       +
       +        for (j=0; j<*ny+2; j++)
       +            for (i=0; i<*nx+2; i++)
       +                fread(&V[i][j], sizeof(double), 1, fp);
       +
       +        fclose(fp);
       +    }
       +    return 0;
       +}
 (DIR) diff --git a/src/main.c b/src/main.c
       t@@ -0,0 +1,27 @@
       +#include <stdio.h>
       +#include "file_io.h"
       +#include "utility.h"
       +
       +int main(int argc, char** argv)
       +{
       +
       +    double t, t_end, tau;
       +    int itermax;
       +    double epsilon, omega, gamma;
       +    double gx, gy, re;
       +    int w_left, w_right, w_top, w_bottom;
       +    double dx, dy;
       +    int nx, ny;
       +    double **P, **U, **V;
       +
       +    read_file("unnamed.dat", &t, &t_end, &tau, &itermax, &epsilon, &omega, &gamma, 
       +            &gx, &gy, &re, &w_left, &w_right, &w_top, &w_bottom,
       +            &dx, &dy, &nx, &ny, P, U, V);
       +
       +    printf("omega = %f\n", omega);
       +    printf("P[0][0] = %f\n", P[0][0]);
       +    printf("V[%d][%d] = %f\n", nx, ny, V[nx][ny]);
       +
       +    free_memory(P, U, V, nx);
       +    return 0;
       +}
 (DIR) diff --git a/src/utility.c b/src/utility.c
       t@@ -1,36 +1,49 @@
        #include <stdio.h>
        #include <stdlib.h>
        
       -/* Linear index from two-dimensional index */
       -unsigned int idx(int x, int y, int nx)
       +int allocate_matrix(double ***M, int nx, int ny)
        {
       -    return x + y*nx;
       +    int i;
       +    *M = (double**)malloc(sizeof(double*)*nx);
       +    if (*M == NULL)
       +        return 1;
       +
       +    for (i=0; i<nx; i++) {
       +        (*M)[i] = (double*)malloc(sizeof(double)*ny);
       +        if ((*M)[i] == NULL)
       +            return 1;
       +    }
       +    return 0;
       +}
       +
       +void free_matrix(double ***M, int nx)
       +{
       +    int i;
       +    for (i=0; i<nx; i++)
       +        free((*M)[i]);
       +    free(*M);
        }
        
       -/* Allocate memory for 2d arrays */
       -int allocate_memory(double *p, double *u, double *v, int nx, int ny)
       +int allocate_memory(double **P, double **U, double **V, int nx, int ny)
        {
       -    p = malloc(sizeof(double)*(nx+1)*(ny+1));
       -    if (p == NULL) {
       -        fprintf(stderr, "allocate_memory: Could not allocate memory for p\n");
       +    if (allocate_matrix(&P, nx+1, ny+1) != 0) {
       +        fprintf(stderr, "allocate_memory: Could not allocate memory for P\n");
                return 1;
            }
       -    u = malloc(sizeof(double)*(nx+2)*(ny+2));
       -    if (u == NULL) {
       -        fprintf(stderr, "allocate_memory: Could not allocate memory for u\n");
       +    if (allocate_matrix(&U, nx+2, ny+2) != 0) {
       +        fprintf(stderr, "allocate_memory: Could not allocate memory for U\n");
                return 1;
            }
       -    v = malloc(sizeof(double)*(nx+2)*(ny+2));
       -    if (v == NULL) {
       -        fprintf(stderr, "allocate_memory: Could not allocate memory for v\n");
       +    if (allocate_matrix(&V, nx+2, ny+2) != 0) {
       +        fprintf(stderr, "allocate_memory: Could not allocate memory for V\n");
                return 1;
            }
            return 0;
        }
        
       -void free_memory(double *p, double *u, double *v)
       +void free_memory(double **P, double **U, double **V, int nx)
        {
       -    free(p);
       -    free(u);
       -    free(v);
       +    free_matrix(&P, nx);
       +    free_matrix(&U, nx);
       +    free_matrix(&V, nx);
        }
 (DIR) diff --git a/src/utility.h b/src/utility.h
       t@@ -1,8 +1,10 @@
        #ifndef UTILITY_H_
        #define UTILITY_H_
        
       -unsigned int idx(int x, int y, int nx);
       -int allocate_memory(double *p, double *u, double *v, int nx, int ny);
       -void free_memory(double *p, double *u, double *v);
       +int allocate_matrix(double ***M, int nx, int ny);
       +void free_matrix(double ***M, int nx);
       +
       +int allocate_memory(double **P, double **U, double **V, int nx, int ny);
       +void free_memory(double **P, double **U, double **V, int nx);
        
        #endif