diff --git a/Kernel/lenard_jones_kernel.c b/Kernel/lenard_jones_kernel.c
new file mode 100644
index 0000000000000000000000000000000000000000..cb3c81a0d3e146238f0c1f1131c56772eef4c078
--- /dev/null
+++ b/Kernel/lenard_jones_kernel.c
@@ -0,0 +1,82 @@
+#include "lenard_jones_kernel.h"
+#include <stdlib.h>
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+struct lenard_jones_kernel
+{
+    double c6; 
+    double c12;
+};
+
+void* lenard_jones_create(char* name)
+{
+    void* src = malloc(sizeof(lenard_jones_kernel));
+    FILE* infile = fopen(name, "r");
+    if(infile == NULL)
+    {
+        perror("Error in opening file:");
+        free(src);
+        return NULL;
+    }
+    char buffer[512];
+    while(fgets(buffer, 512, infile) != NULL)
+    {
+         char* tmp = strtok(buffer, " ");
+         if(strcmp(tmp, "C6") == 0)
+         {
+             tmp = strtok(NULL, " ");
+             if(tmp != NULL)
+                 ((lenard_jones_kernel*)src)->c6 = atof(tmp);
+             else
+             {
+                 printf("Error formating\n");
+                 free(src);
+                 return NULL;
+             }
+         }
+         else if(strcmp(tmp, "C12") == 0)
+         {
+             tmp = strtok(NULL, " ");
+             if(tmp != NULL)
+                 ((lenard_jones_kernel*)src)->c12 = atof(tmp);
+             else
+             {
+                 printf("Error formating\n");
+                 free(src);
+                 return NULL;
+             }
+         }
+         else
+         {
+             printf("Unrecognized pattern\n");
+             free(src);
+             return NULL;
+         }
+    }
+    return src;
+}
+
+double lenard_jones_compute(size_t i, size_t j, size_t k, double* origin, double** basis, void* src)
+{
+    lenard_jones_kernel* kernel = (lenard_jones_kernel*)src;
+    double pos[3];
+    for(size_t dim = 0; dim < 3; ++dim)
+        pos[dim] = basis[dim][0]*i + basis[dim][1]*j + basis[dim][2]*k + origin[dim];
+    double d = sqrt(pos[0] * pos[0] + pos[1] * pos[1] + pos[2] * pos[2]);
+    d = d*d*d*d*d*d;
+    if(d > 0.)
+    {
+        double e = -(kernel->c6)/d+(kernel->c12)/(d*d);
+        return (e>1e4) ? 1e4 : e;
+    }
+    else
+    {
+        return 1e4;
+    }
+}
+
+void lenard_jones_destroy(void* src)
+{
+    free(src);
+}
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000000000000000000000000000000000000..7cc29d2a906ce553a26be66c1402b77e4a5f22e5
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,40 @@
+CC=gcc
+INC=-I/usr/include -I./inc
+ifeq ($(dbg),1)
+	CFLAGS=-std=c99 -g -Og -Wall -Wextra
+else
+	CFLAGS=-std=c99 -O3 -Wall -Wextra
+endif
+CLIB=-lfftw3 -lm
+OBJ=main.o GridDxFormat/grid_reader.o Kernel/debye_huckel_kernel.o LinkList/link_list.o fftw/fftw.o Kernel/lenard_jones_kernel.o
+ifeq ($(dbg),1)
+	EXE=gen_pot-dbg
+else
+	EXE=gen_pot
+endif
+
+all: ${EXE}
+
+${EXE}:${OBJ}
+	${CC} ${CFLAGS} ${INC} ${OBJ} -o ${EXE} ${CLIB}
+
+main.o: main.c
+	${CC} ${CFLAGS} ${INC} -c main.c -o main.o
+
+GridDxFormat/grid_reader.o: GridDxFormat/grid_reader.c
+	${CC} ${CFLAGS} ${INC} -c GridDxFormat/grid_reader.c -o GridDxFormat/grid_reader.o
+
+Kernel/debye_huckel_kernel.o:Kernel/debye_huckel_kernel.c
+	${CC} ${CFLAGS} ${INC} -c Kernel/debye_huckel_kernel.c -o Kernel/debye_huckel_kernel.o
+
+Kernel/lenard_jones_kernel.o:Kernel/lenard_jones_kernel.c
+	${CC} ${CFLAGS} ${INC} -c Kernel/lenard_jones_kernel.c -o Kernel/lenard_jones_kernel.o
+
+LinkList/link_list.o:LinkList/link_list.c
+	${CC} ${CFLAGS} ${INC} -c LinkList/link_list.c -o LinkList/link_list.o
+
+fftw/fftw.o:fftw/fftw.c
+	${CC} ${CFLAGS} ${INC} -c fftw/fftw.c -o fftw/fftw.o
+
+clean:
+	rm -f ${OBJ} ${EXE}
diff --git a/inc/kernel.h b/inc/kernel.h
index 4f8a006d3a0819472eaed02356880f6d8adba086..ced6030d26339cbdb2f6ec82084652f809e4bb88 100644
--- a/inc/kernel.h
+++ b/inc/kernel.h
@@ -4,3 +4,4 @@ typedef void* (*create_type)(char*);
 typedef void  (*destroy_type)(char*);
 #endif
 #include "debye_huckel_kernel.h"
+#include "lenard_jones_kernel.h"
diff --git a/inc/lenard_jones_kernel.h b/inc/lenard_jones_kernel.h
new file mode 100644
index 0000000000000000000000000000000000000000..3c6bdf933a61366f0ede7faa7d4152b6f8bac79d
--- /dev/null
+++ b/inc/lenard_jones_kernel.h
@@ -0,0 +1,14 @@
+#ifdef KERNEL_TYPE
+ComputeType(lenard_jones, lenard_jones_compute);
+CreateType(lenard_jones, lenard_jones_create);
+DestroyType(lenard_jones, lenard_jones_destroy);
+#else
+#ifndef LENARD_JONES_H_
+#define LENARD_JONES_H_
+#include <stddef.h>
+typedef struct lenard_jones_kernel lenard_jones_kernel;
+void* lenard_jones_create(char* name);
+double lenard_jones_compute(size_t i, size_t j, size_t k, double* origin, double** basis, void* src);
+void lenard_jones_destroy(void*);
+#endif
+#endif
diff --git a/main.c b/main.c
index 1c3d8540c09f3873857618ea30d8594d348f7c11..e8c0d7f83ad210dd5124420a74cd2593ce0f9f98 100644
--- a/main.c
+++ b/main.c
@@ -16,6 +16,20 @@ static void inner_product_grid(fftw_complex* dest, fftw_complex* src, size_t nx,
         dest[i][1] = (re*src[i][1]+im*src[i][0])/V;
     }
 }
+static void shift_zero_frequency(size_t nx, size_t ny, size_t nz, double* data)
+{
+    for(size_t i = 0; i < nx; ++i)
+    {
+        for(size_t j = 0; j < ny; ++j)
+        {
+            for(size_t k = 0; k < nz; ++k)
+            {
+                size_t idx = k + nz * (j + ny * i);
+                *(data+idx) = (*(data+idx))*2.*(0.5-(double)((i+j+k)%2));
+            }
+        }
+    }
+}
 static void print_usage()
 {
     printf("./exec input_density_dx_file potential_kernel_name kernel_init_file outpu_dx_file\n");
@@ -34,8 +48,8 @@ int main(int argc, char** argv)
                                               &shallow_destructor,          &shallow_destructor, &string_compare);
 
     link_list* create_map = link_list_create(&shallow_default_constructor, &shallow_default_constructor,
-                                              &shallow_copy_constructor,    &shallow_copy_constructor,
-                                              &shallow_destructor,          &shallow_destructor, &string_compare);
+                                             &shallow_copy_constructor,    &shallow_copy_constructor,
+                                             &shallow_destructor,          &shallow_destructor, &string_compare);
 
     link_list* destroy_map = link_list_create(&shallow_default_constructor, &shallow_default_constructor,
                                               &shallow_copy_constructor,    &shallow_copy_constructor,
@@ -70,6 +84,10 @@ int main(int argc, char** argv)
 
     compute_type functor = find_list(compute_map, kernel_name);
     set_grid_data(potential, functor, kernel);
+    gridformat_writer("kernel.dx", potential);
+    //shift_zero_frequency(get_nx(density), get_ny(density), get_nz(density), get_grid_data(density));
+    //shift_zero_frequency(get_nx(potential), get_ny(potential), get_nz(potential), get_grid_data(potential));
+
     fftw_complex* density_out, *potential_out;
     fftw_plan plan1, plan2;