diff --git a/GridDxFormat/grid_reader.c b/GridDxFormat/grid_reader.c
index e90d9024e596765d59bc945ed308d3a1709e1a4e..ef11ba833c05ea713b15d8dc2ff9d9fdf5f6b9b8 100644
--- a/GridDxFormat/grid_reader.c
+++ b/GridDxFormat/grid_reader.c
@@ -405,7 +405,7 @@ void set_grid_data(void* src, compute_type compute, void* kernel)
     } 
 }
 
-static void* create_new_grid(size_t nx, size_t ny, size_t nz, double* origin, double** basis)
+void* create_new_grid(size_t nx, size_t ny, size_t nz, double* origin, double** basis)
 {
     void* g = malloc(sizeof(grid));
     ((grid*)g)->nx = nx;
@@ -602,6 +602,14 @@ void sum_grids(void* dest, int num, void** src)
     }
 }
 
+void sub_grids(void* dest, void* s1, void* s2)
+{
+    grid* src1 = (grid*)s1;
+    grid* src2 = (grid*)s2;
+    grid* out = (grid*)dest;
+    for(size_t idx = 0; idx < out->size; idx++)
+        out->data[idx] = src1->data[idx]-src2->data[idx];
+}
 void pad_grid(void** g, int nx, int ny, int nz)
 {
     grid* src = (grid*)(*g);
@@ -628,7 +636,12 @@ void pad_grid(void** g, int nx, int ny, int nz)
         }
     }
     grid_destroy(src);
-    *g = dest;  
+    *g = dest;
+    double* o = get_grid_origin(*g);
+    double** b= get_grid_basis(*g);
+    o[0] -= (nx-old_nx)/2*b[0][0];
+    o[1] -= (ny-old_ny)/2*b[1][1];
+    o[2] -= (nz-old_nz)/2*b[2][2];
 }
 
 void slice_grid(void** g, int nx, int ny, int nz)
@@ -659,12 +672,17 @@ void slice_grid(void** g, int nx, int ny, int nz)
             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));
+                int new = (k-k0) + nz * ( j - j0 + ny * (i - i0));
                 (get_grid_data(dest))[new] = (get_grid_data(src))[old];
             }
         }
     }
     grid_destroy(src);
-    *g = dest;  
+    *g = dest;
+    double* o = get_grid_origin(*g);
+    double** b = get_grid_basis(*g);
+    o[0] -= (nx-old_nx)/2*b[0][0];
+    o[1] -= (ny-old_ny)/2*b[1][1];
+    o[2] -= (nz-old_nz)/2*b[2][2];
 }
 
diff --git a/Kernel/debye_huckel_kernel.c b/Kernel/debye_huckel_kernel.c
index b7f840f8c7b807884c90076b30e51ea0bb693441..04df7504b2418b48ea8d07721466218187d69df6 100644
--- a/Kernel/debye_huckel_kernel.c
+++ b/Kernel/debye_huckel_kernel.c
@@ -6,7 +6,7 @@
 struct debye_huckel_kernel
 {
     double screen_length; 
-    double shift;
+    double epsilon;
 };
 
 void* debye_huckel_create(char* name)
@@ -35,11 +35,11 @@ void* debye_huckel_create(char* name)
                  return NULL;
              }
          }
-         else if(strcmp(tmp, "Shift") == 0)
+         else if(strcmp(tmp, "Dielectric") == 0)
          {
              tmp = strtok(NULL, " ");
              if(tmp != NULL)
-                 ((debye_huckel_kernel*)src)->shift = atof(tmp);
+                 ((debye_huckel_kernel*)src)->epsilon = atof(tmp);
              else
              {
                  printf("Error formating\n");
@@ -54,6 +54,7 @@ void* debye_huckel_create(char* name)
              return NULL;
          }
     }
+    fclose(infile);
     return src;
 }
 
@@ -63,9 +64,14 @@ double debye_huckel_compute(size_t i, size_t j, size_t k, double* origin, double
     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]);    
-    double e = exp(-d/kernel->screen_length)/(d+kernel->shift);  
-    return (e > 100) ? 100: e;
+    double d = sqrt(pos[0] * pos[0] + pos[1] * pos[1] + pos[2] * pos[2]);
+    if(d > 0.)
+    {
+        double e = exp(-d/kernel->screen_length)/d/kernel->epsilon;  
+        return (e > 20.) ? 20.: e;
+    }
+    else
+        return 20.;
 }
 
 void debye_huckel_destroy(void* src)
diff --git a/Kernel/lenard_jones_kernel.c b/Kernel/lenard_jones_kernel.c
index 12a7e481c38cacc26536e7902c99f7ac985c0934..a1f31df00995cf2d8c9650baa6453b22e2c9c84b 100644
--- a/Kernel/lenard_jones_kernel.c
+++ b/Kernel/lenard_jones_kernel.c
@@ -54,6 +54,7 @@ void* lenard_jones_create(char* name)
              return NULL;
          }
     }
+    fclose(infile);
     return src;
 }
 
diff --git a/Kernel/lenard_jones_repulsion_kernel.c b/Kernel/lenard_jones_repulsion_kernel.c
index 735c45eef9d550950b7f6e2fc788a458c34d792d..c2c150522fdd259e646eeb94b39df15b19ca1ad0 100644
--- a/Kernel/lenard_jones_repulsion_kernel.c
+++ b/Kernel/lenard_jones_repulsion_kernel.c
@@ -54,6 +54,7 @@ void* lenard_jones_repulsion_create(char* name)
              return NULL;
          }
     }
+    fclose(infile);
     return src;
 }
 
diff --git a/Kernel/lenard_jones_trunc_kernel.c b/Kernel/lenard_jones_trunc_kernel.c
index e5dad1c55810c1f6ab42ff2d5c611ba2edbfdf7f..e7e0f82d68a889efce7cab8e41d325a7188c9878 100644
--- a/Kernel/lenard_jones_trunc_kernel.c
+++ b/Kernel/lenard_jones_trunc_kernel.c
@@ -72,6 +72,7 @@ void* lenard_jones_trunc_create(char* name)
     }
     ((lenard_jones_trunc_kernel*)src)->c6 /= ((lenard_jones_trunc_kernel*)src)->scaling;
     ((lenard_jones_trunc_kernel*)src)->c12 /= ((lenard_jones_trunc_kernel*)src)->scaling;
+    fclose(infile);
     return src;
 }
 
diff --git a/Makefile b/Makefile
index c9d44be93910d91ffe33361f6506cf0eed57e3ad..14519783b60aa5caa0c82a0ae05863774f5a1ebe 100644
--- a/Makefile
+++ b/Makefile
@@ -1,31 +1,43 @@
 CC=gcc
-INC=-I/usr/include -I./inc
+INC=-I/usr/include -I/home/hchou10/GenerateGridPotential/inc
 ifeq ($(dbg),1)
 	CFLAGS= -std=c99 -D_GNU_SOURCE -g -Og -Wall -Wextra -lm
 else
 	CFLAGS= -std=c99 -D_GNU_SOURCE -O3 -Wall -Wextra -lm
 endif
 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
+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 Kernel/tabulated_pot_kernel.o Kernel/onc_elec_kernel.o Kernel/gaussian_kernel.o \
+Kernel/lenard_jones_kernel1.o
+
 ifeq ($(dbg),1)
 	EXE=gen_pot-dbg
 else
 	EXE=gen_pot
 endif
-EXE_SUM=sum_grid
+EXE_SUM=sum_grid slice_grid sub_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}
+${EXE_SUM}: grid_tools/sum.o GridDxFormat/grid_reader.o grid_tools/slice.o grid_tools/sub.o
+	${CC} ${CFLAGS} ${INC} grid_tools/sum.o GridDxFormat/grid_reader.o -o sum_grid
+	${CC} ${CFLAGS} ${INC} grid_tools/slice.o GridDxFormat/grid_reader.o -o slice_grid
+	${CC} ${CFLAGS} ${INC} grid_tools/sub.o GridDxFormat/grid_reader.o -o sub_grid
 
 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
+grid_tools/sub.o: grid_tools/sub.c
+	${CC} ${CFLAGS} ${INC} -c grid_tools/sub.c -o grid_tools/sub.o
+
+grid_tools/sum.o: grid_tools/sum.c
+	${CC} ${CFLAGS} ${INC} -c grid_tools/sum.c -o grid_tools/sum.o
+
+grid_tools/slice.o: grid_tools/slice.c
+	${CC} ${CFLAGS} ${INC} -c grid_tools/slice.c -o grid_tools/slice.o
 
 GridDxFormat/grid_reader.o: GridDxFormat/grid_reader.c
 	${CC} ${CFLAGS} ${INC} -c GridDxFormat/grid_reader.c -o GridDxFormat/grid_reader.o
@@ -36,12 +48,24 @@ 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_kernel1.o:Kernel/lenard_jones_kernel1.c
+	${CC} ${CFLAGS} ${INC} -c Kernel/lenard_jones_kernel1.c -o Kernel/lenard_jones_kernel1.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
 
+Kernel/tabulated_pot_kernel.o:Kernel/tabulated_pot_kernel.c
+	${CC} ${CFLAGS} ${INC} -c Kernel/tabulated_pot_kernel.c -o Kernel/tabulated_pot_kernel.o
+
+Kernel/onc_elec_kernel.o:Kernel/onc_elec_kernel.c
+	${CC} ${CFLAGS} ${INC} -c Kernel/onc_elec_kernel.c -o Kernel/onc_elec_kernel.o
+
+Kernel/gaussian_kernel.o:Kernel/gaussian_kernel.c
+	${CC} ${CFLAGS} ${INC} -c Kernel/gaussian_kernel.c -o Kernel/gaussian_kernel.o
+
 LinkList/link_list.o:LinkList/link_list.c
 	${CC} ${CFLAGS} ${INC} -c LinkList/link_list.c -o LinkList/link_list.o
 
@@ -49,4 +73,4 @@ fftw/fftw.o:fftw/fftw.c
 	${CC} ${CFLAGS} ${INC} -c fftw/fftw.c -o fftw/fftw.o
 
 clean:
-	rm -f ${OBJ} ${EXE} ${EXE_SUM}
+	rm -f ${OBJ} ${EXE} ${EXE_SUM} grid_tools/*.o
diff --git a/inc/grid_reader.h b/inc/grid_reader.h
index 7b6c6d7ba517595f1bf5f52a2e20d2ff15653b1d..b3f5f694d03b3af694d2b3f887258f8a000054b9 100644
--- a/inc/grid_reader.h
+++ b/inc/grid_reader.h
@@ -18,6 +18,8 @@ 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 sub_grids(void* dest, void* s1, void* s2);
 void pad_grid(void** g, int nx, int ny, int nz);
 void slice_grid(void** g, int nx, int ny, int nz);
+void* create_new_grid(size_t nx, size_t ny, size_t nz, double* origin, double** basis);
 #endif
diff --git a/inc/kernel.h b/inc/kernel.h
index 971a74e64314c82cc9e9aafb060cf11515cbe160..51936b69f03a389151a5986e1cffad4f5301ba78 100644
--- a/inc/kernel.h
+++ b/inc/kernel.h
@@ -7,3 +7,7 @@ typedef void  (*destroy_type)(char*);
 #include "lenard_jones_kernel.h"
 #include "lenard_jones_trunc_kernel.h"
 #include "lenard_jones_repulsion_kernel.h"
+#include "tabulated_pot_kernel.h"
+#include "onc_elec_kernel.h"
+#include "gaussian_kernel.h"
+#include "lenard_jones_kernel1.h"