diff --git a/header.h b/header.h
new file mode 100644
index 0000000000000000000000000000000000000000..ce8bc5a66a5634c3897d9f6ae5ef13d402779762
--- /dev/null
+++ b/header.h
@@ -0,0 +1,18 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+#include <errno.h>
+
+#define ARGS_NUM 9
+
+int Nx, Ny, MaxI;
+double Hx, Hy, W;
+double UDivisor;
+double Pipi = M_PI * M_PI; // Pipi = Pi * Pi
+
+void print_errno(void);
+void getParams(int argc, char* argv[], FILE *fp);
+double f(double x, double y);
+void u(int i, int j, double **u, double **f);
+double residueNorm(double *r);
diff --git a/pdeSolver.c b/pdeSolver.c
index ac9382c7752693cf620bb175c056e35236d4f75f..afd011be23a9e5616b07599227fd9bcf4630377f 100644
--- a/pdeSolver.c
+++ b/pdeSolver.c
@@ -1,7 +1,4 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
+#include "header.h"
 
 /* Final version of simplified equation:
 u(i,j) = f(x,y) + (u(i+1,j) + u(i-1,j))/Δx² + (u(i,j+1) + u(i,j-1))/Δy² + (-u(i+1,j)+u(i-1,j))/2Δx + (-u(i,j+1)+u(i,j-1))/2Δy
@@ -12,21 +9,48 @@ u(i,j) = f(x,y) + (u(i+1,j) + u(i-1,j))/Δx² + (u(i,j+1) + u(i,j-1))/Δy² + (-
 
 //#define MAX_SIZE 100000000 // 100 MB.
 //int inMemory = 0;
-int Nx, Ny, MaxI;
-double Hx, Hy, W;
-double UDivisor;
-double Pipi = M_PI * M_PI; // Pipi = Pi * Pi
+
+void print_errno(void) {
+    printf("%s",strerror(errno));
+}
+
+void getParams(int argc, char* argv[], FILE *fp) {
+    if(argc != ARGS_NUM) {
+        fprintf(stderr,"Wrong number of arguments.\n");
+        exit(-1);
+    }
+    int i;
+    for(i=1; i<ARGS_NUM; i+=2) {
+        if(strcmp(argv[i],"-hx") == 0) {
+            Hx = atof(argv[i+1]);
+        } else if(strcmp(argv[i],"-hy") == 0) {
+            Hy = atof(argv[i+1]);
+        } else if(strcmp(argv[i],"-i") == 0) {
+            MaxI = atoi(argv[i+1]);
+        } else if(strcmp(argv[i],"-o") == 0) {
+            fp = fopen(argv[i+1],"w");
+        } else {
+            fprintf(stderr,"Incorrect parameter.\n");
+            exit(-1);
+        }
+    }
+}
 
 double f(double x, double y) { // If stored in memory, it will need Nx * Ny * 8 bytes of memory. Should we do it?
 	return 4 * M_PI * ( ( sin(2 * M_PI * x) ) * ( sinh(M_PI * y) ) + ( sin(2 * Pipi - M_PI * x) ) * ( sinh(Pipi - M_PI * y) ));
 }
 
-void u(int i, int j, double **u, double **f) {
+inline int in(int i, int j) {
+// Calcula o indice do vetor, como se fosse uma matriz.
+	return i*Ny + j;
+}
+
+void calcU(int i, int j, double *u) {
 	double res = 0;
-	res += f[i][j] + (u[i+1][j] + u[i-1][j]) / Hx * Hx + (u[i][j+1] + u[i][j-1]) / Hy * Hy;
-	res += (u[i-1][j] - u[i+1][j]) / 2 * Hx + (u[i][j-1] - u[i][j+1]) / 2 * Hy;
+	res += f(i,j) + (u[ in(i+1,j) ] + u[ in(i-1,j) ] ) / Hx * Hx + (u[ in(i,j+1) ] + u[ in(i,j-1) ]) / Hy * Hy;
+	res += (u[ in(i-1,j) ] - u[ in(i+1,j) ]) / 2 * Hx + (u[ in(i,j-1) ] - u[ in(i,j+1) ]) / 2 * Hy;
 	res = res / UDivisor;
-	u[i][j] = res;
+	u[ in(i,j) ] = res;
 }
 
 double residueNorm(double *r) {
@@ -43,20 +67,7 @@ int main(int argc, char *argv[]) {
 	int i, j, k;
 	FILE *fpExit;
 
-	fpExit = fopen(argv[5],"w");
-
-	if(argc == 9) {
-		if((strcmp(argv[1],"-hx") != 0) || (strcmp(argv[3],"-hy") != 0) || (strcmp(argv[5],"-i") != 0) || (strcmp(argv[7],"-o") != 0)) {
-			puts("Please use the following format: './pdeSolver -hx <Hx> -hy <Hy> -i <maxIter> -o arquivo_saida.'");
-			exit(-1);
-		}
-	} else {
-		puts("Please use the following format: './pdeSolver -hx <Hx> -hy <Hy> -i <maxIter> -o arquivo_saida.'");
-	}
-
-	Hx = atof(argv[2]);
-	Hy = atof(argv[4]);
-	MaxI = atoi(argv[6]);
+	getParams(argc,argv,fpExit);
 
 	Nx = (1/Hx);
 	Ny = (1/Hy);
@@ -76,37 +87,40 @@ int main(int argc, char *argv[]) {
 	}*/
 
 	double sigma;
-	double **u,**f;
+	//double **u,**f;
 
-	for(i=0; i<Nx; i++) {
+	/*for(i=0; i<Nx; i++) {
 		for(j=0; i<Ny; i++) {
 			u[i][j] = calloc(sizeof(double));
 			f[i][j] = malloc(sizeof(double));
 			f[i][j] = f(i*Hx,j*Hy);
 		}
-	}
+	}*/
+
+	double *u = calloc(sizeof(double), Nx * Ny);
+
 	sigma = sinh(M_PI * M_PI);
 	for(i=0; i<Nx; i++) { // Calculate side extremities (top and bottom are always 0).
-		u[i][0] = sin(2 * M_PI * (M_PI - (i * Hx))) * sigma;
-		u[i][Nx] = sin(2 * M_PI * (i * Hx));
+		u[ in(i,0) ] = sin(2 * M_PI * (M_PI - (i * Hx))) * sigma;
+		u[ in(i,Nx) ] = sin(2 * M_PI * (i * Hx));
 	}
 
 	// Nx columns and Ny rows.
 
-	for(k=0; k<MaxI; k++) {
+	/*for(k=0; k<MaxI; k++) {
 		for(i=1; i<Ny; i++) {
 			sigma = 0;
 			for(j=1; j<Nx; j++) {
 				/*if(j != i) {
 					sigma += a[i][j] * fi[i];
 				}*/
-				sigma += a[i][j] * fi[i];
+				/*sigma += a[i][j] * fi[i];
 			}
 			sigma -= a[i][i] * fi[i];
 			//fi[i] = (1 - W) * fi[i] + W/a[i][i] * (b[i] - sigma);
 			fi[i] = fi[i] + W * ((b[i] - sigma) / a[i][i] - fi[i])
 		}
-	}
+	}*/
 
 	return 0;
 }
\ No newline at end of file