diff --git a/GridDxFormat/grid_reader.c b/GridDxFormat/grid_reader.c
index 909a77a9489e389024760c0c979e160e36744e57..e90d9024e596765d59bc945ed308d3a1709e1a4e 100644
--- a/GridDxFormat/grid_reader.c
+++ b/GridDxFormat/grid_reader.c
@@ -243,10 +243,12 @@ int gridformat_writer(char* name, void* src)
     bytes_write = write(fildes, "#OpenDx file generated from grids reader/writer program\n",56);
     if(bytes_write < -1)
     {
+        perror("Error in writing");
         return errno;
     }
     else if(bytes_write < 56)
     {
+        fprintf(stderr, "less bytes written");
         return 9999;
     }
 
@@ -258,10 +260,12 @@ int gridformat_writer(char* name, void* src)
 
     if(bytes_write < -1)
     {
+        perror("Error in writing");
         return errno;
     }
     else if(bytes_write < len)
     {
+        fprintf(stderr, "less bytes written");
         return 9999;
     }
 
@@ -271,10 +275,12 @@ int gridformat_writer(char* name, void* src)
 
     if(bytes_write < -1)
     {
+        perror("Error in writing");
         return errno;
     }
     else if(bytes_write < len)
     {
+        fprintf(stderr, "less bytes written");
         return 9999;
     }
 
@@ -285,10 +291,12 @@ int gridformat_writer(char* name, void* src)
         bytes_write = write(fildes, buff, len);
         if(bytes_write < -1)
         {
+            perror("Error in writing");
             return errno;
         }
         else if(bytes_write < len)
         {
+            fprintf(stderr, "less bytes written");
             return 9999;
         }
 
@@ -299,10 +307,12 @@ int gridformat_writer(char* name, void* src)
     bytes_write = write(fildes, buff, len);
     if(bytes_write < -1)
     {
+        perror("Error in writing");
         return errno;
     }
     else if(bytes_write < len)
     {
+        fprintf(stderr, "less bytes written");
         return 9999;
     }
 
@@ -311,10 +321,12 @@ int gridformat_writer(char* name, void* src)
     bytes_write = write(fildes, buff, len);
     if(bytes_write < -1)
     {
+        perror("Error in writing");
         return errno;
     }
     else if(bytes_write < len)
     {
+        fprintf(stderr, "less bytes written");
         return 9999;
     }
 
@@ -326,10 +338,12 @@ int gridformat_writer(char* name, void* src)
         bytes_write = write(fildes, buff, len);
         if(bytes_write < -1)
         {
+            perror("Error in writing");
             return errno;
         }
         else if(bytes_write < len)
         {
+            fprintf(stderr, "less bytes written");
             return 9999;
         }
     }
@@ -340,10 +354,12 @@ int gridformat_writer(char* name, void* src)
         bytes_write = write(fildes, buff, len);
         if(bytes_write < -1)
         {
+            perror("Error in writing");
             return errno;
         }
         else if(bytes_write < len)
         {
+            fprintf(stderr, "less bytes written");
             return 9999;
         }
     }
@@ -354,10 +370,12 @@ int gridformat_writer(char* name, void* src)
         bytes_write = write(fildes, buff, len);
         if(bytes_write < -1)
         {
+            perror("Error in writing");
             return errno;
         }
         else if(bytes_write < len)
         {
+            fprintf(stderr, "less bytes written");
             return 9999;
         }
     }
@@ -583,3 +601,70 @@ void sum_grids(void* dest, int num, void** src)
             out->data[idx] += in[i]->data[idx];
     }
 }
+
+void pad_grid(void** g, int nx, int ny, int nz)
+{
+    grid* src = (grid*)(*g);
+    int old_nx = get_nx(src);
+    int old_ny = get_ny(src);
+    int old_nz = get_nz(src);
+    if(nx < old_nx || ny < old_ny || nz < old_nz)
+    {
+        fprintf(stderr, "New grid dimension is smaller than old one, use slice function\n");
+        return;
+    }
+    grid* dest = create_new_grid(nx, ny, nz, get_grid_origin(src), get_grid_basis(src));
+
+    for(int i = 0; i < old_nx; ++i)
+    {
+        for(int j = 0; j < old_ny; ++j)
+        {
+            for(int k = 0; k < old_nz; ++k)
+            {
+                int old = k + old_nz * ( j + old_ny * i);
+                int new = k+(nz-old_nz)/2 + nz * ( j + (ny-old_ny)/2 + ny * (i +(nx-old_nx)/2));
+                (get_grid_data(dest))[new] = (get_grid_data(src))[old];
+            }
+        }
+    }
+    grid_destroy(src);
+    *g = dest;  
+}
+
+void slice_grid(void** g, int nx, int ny, int nz)
+{
+    grid* src = (grid*)(*g);
+    int old_nx = get_nx(src);
+    int old_ny = get_ny(src);
+    int old_nz = get_nz(src);
+    if(nx > old_nx || ny > old_ny || nz > old_nz)
+    {
+        fprintf(stderr, "New grid dimension is bigger than old one, use pad function\n");
+        return;
+    }
+    grid* dest = create_new_grid(nx, ny, nz, get_grid_origin(src), get_grid_basis(src));
+
+    int i0 = (old_nx-nx)/2;
+    int i1 = i0 + nx;
+
+    int j0 = (old_ny-ny)/2;
+    int j1 = j0 + ny;
+
+    int k0 = (old_nz-nz)/2;
+    int k1 = k0 + nz;
+    for(int i = i0; i < i1; ++i)
+    {
+        for(int j = j0; j < j1; ++j)
+        {
+            for(int k = k0; k < k1; ++k)
+            {
+                int old = k + old_nz * ( j + old_ny * i);
+                int new = k+(nz-old_nz)/2 + nz * ( j + (ny-old_ny)/2 + ny * (i +(nx-old_nx)/2));
+                (get_grid_data(dest))[new] = (get_grid_data(src))[old];
+            }
+        }
+    }
+    grid_destroy(src);
+    *g = dest;  
+}
+
diff --git a/Makefile b/Makefile
index 7cc29d2a906ce553a26be66c1402b77e4a5f22e5..c9d44be93910d91ffe33361f6506cf0eed57e3ad 100644
--- a/Makefile
+++ b/Makefile
@@ -1,26 +1,32 @@
 CC=gcc
 INC=-I/usr/include -I./inc
 ifeq ($(dbg),1)
-	CFLAGS=-std=c99 -g -Og -Wall -Wextra
+	CFLAGS= -std=c99 -D_GNU_SOURCE -g -Og -Wall -Wextra -lm
 else
-	CFLAGS=-std=c99 -O3 -Wall -Wextra
+	CFLAGS= -std=c99 -D_GNU_SOURCE -O3 -Wall -Wextra -lm
 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
+CLIB=-lfftw3
+OBJ=main.o GridDxFormat/grid_reader.o Kernel/debye_huckel_kernel.o Kernel/lenard_jones_repulsion_kernel.o Kernel/lenard_jones_trunc_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_SUM=sum_grid
+all: ${EXE} ${EXE_SUM}
 
 ${EXE}:${OBJ}
 	${CC} ${CFLAGS} ${INC} ${OBJ} -o ${EXE} ${CLIB}
 
+${EXE_SUM}: sum.o GridDxFormat/grid_reader.o
+	${CC} ${CFLAGS} ${INC} sum.o GridDxFormat/grid_reader.o -o ${EXE_SUM}
+
 main.o: main.c
 	${CC} ${CFLAGS} ${INC} -c main.c -o main.o
 
+sum.o: sum.c
+	${CC} ${CFLAGS} ${INC} -c sum.c -o sum.o
+
 GridDxFormat/grid_reader.o: GridDxFormat/grid_reader.c
 	${CC} ${CFLAGS} ${INC} -c GridDxFormat/grid_reader.c -o GridDxFormat/grid_reader.o
 
@@ -30,6 +36,12 @@ Kernel/debye_huckel_kernel.o:Kernel/debye_huckel_kernel.c
 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
 
+Kernel/lenard_jones_trunc_kernel.o:Kernel/lenard_jones_trunc_kernel.c
+	${CC} ${CFLAGS} ${INC} -c Kernel/lenard_jones_trunc_kernel.c -o Kernel/lenard_jones_trunc_kernel.o
+
+Kernel/lenard_jones_repulsion_kernel.o:Kernel/lenard_jones_repulsion_kernel.c
+	${CC} ${CFLAGS} ${INC} -c Kernel/lenard_jones_repulsion_kernel.c -o Kernel/lenard_jones_repulsion_kernel.o
+
 LinkList/link_list.o:LinkList/link_list.c
 	${CC} ${CFLAGS} ${INC} -c LinkList/link_list.c -o LinkList/link_list.o
 
@@ -37,4 +49,4 @@ fftw/fftw.o:fftw/fftw.c
 	${CC} ${CFLAGS} ${INC} -c fftw/fftw.c -o fftw/fftw.o
 
 clean:
-	rm -f ${OBJ} ${EXE}
+	rm -f ${OBJ} ${EXE} ${EXE_SUM}
diff --git a/inc/grid_reader.h b/inc/grid_reader.h
index e5c04d8858136f10adfe193fe0952f0bd8f3767c..7b6c6d7ba517595f1bf5f52a2e20d2ff15653b1d 100644
--- a/inc/grid_reader.h
+++ b/inc/grid_reader.h
@@ -18,4 +18,6 @@ typedef double (*compute_type)(size_t,size_t,size_t,double*,double**, void*);
 void set_grid_data(void* src, compute_type compute, void* kernel);
 void* resample_grid_data(void* src);
 void sum_grids(void* dest, int num, void** src);
+void pad_grid(void** g, int nx, int ny, int nz);
+void slice_grid(void** g, int nx, int ny, int nz);
 #endif
diff --git a/inc/kernel.h b/inc/kernel.h
index ced6030d26339cbdb2f6ec82084652f809e4bb88..971a74e64314c82cc9e9aafb060cf11515cbe160 100644
--- a/inc/kernel.h
+++ b/inc/kernel.h
@@ -5,3 +5,5 @@ typedef void  (*destroy_type)(char*);
 #endif
 #include "debye_huckel_kernel.h"
 #include "lenard_jones_kernel.h"
+#include "lenard_jones_trunc_kernel.h"
+#include "lenard_jones_repulsion_kernel.h"
diff --git a/main.c b/main.c
index 915ab6634785c8f65736a614982e2c5d79b2d035..483d6a6919da2e88c10e886f6c8e700b76c0b5ac 100644
--- a/main.c
+++ b/main.c
@@ -91,9 +91,6 @@ 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;