diff --git a/grid_tools/slice.c b/grid_tools/slice.c
new file mode 100644
index 0000000000000000000000000000000000000000..5409fb5fc68c7d62921fab845cde017fd98a4dae
--- /dev/null
+++ b/grid_tools/slice.c
@@ -0,0 +1,15 @@
+#include <stdlib.h>
+#include "grid_reader.h"
+int main(int argc, char** argv)
+{
+    char* input = argv[1];
+    char* output = argv[2];
+    int nx = atoi(argv[3]);
+    int ny = atoi(argv[4]);
+    int nz = atoi(argv[5]);
+    void* grid = gridformat_reader(input);
+    slice_grid(&grid, nx,ny,nz);
+    gridformat_writer(output, grid);
+    grid_destroy(grid);
+    return 0;
+}
diff --git a/grid_tools/sub.c b/grid_tools/sub.c
new file mode 100644
index 0000000000000000000000000000000000000000..5ab8e706eb4bdeb19441a28cffd8d3bac96dd100
--- /dev/null
+++ b/grid_tools/sub.c
@@ -0,0 +1,79 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include "grid_reader.h"
+#include <stdio.h>
+static void parse_input(char*** input, int* num, char** args)
+{
+    size_t size = 4;
+    *input = (char**)malloc(size*sizeof(char*));
+    char** tmp = args; 
+    size_t count = 0;
+    while(*tmp != NULL)
+    {
+        (*input)[count++] = strdup(*tmp);
+        if(count==size)
+        {
+            size <<= 1;
+            *input = (char**)realloc(*input, size*sizeof(char*));
+        }
+        tmp++;
+        if(strcmp(*tmp, "-o") == 0)
+            break;
+    }
+    (*input)[count] = NULL;
+    *num = count;
+}
+
+static void parse_string(char** argv, char*** input, 
+int* num, char** output)
+{
+    char** ptr = argv;
+    while(*ptr != NULL)
+    {
+        if(strcmp(*ptr, "-i") == 0)
+        {
+            parse_input(input, num, ++ptr);
+        }
+        else if(strcmp(*ptr, "-o") == 0)
+        {
+            *output = strdup(*(++ptr));
+        }
+        else
+            ++ptr;
+    }
+}
+
+int main(int argc, char** argv)
+{
+    char** input_file_name=NULL;
+    char* output_file_name=NULL;
+    int num = 0;
+    parse_string(argv, &input_file_name, &num, &output_file_name);
+    if(num != 2)
+    {
+        fprintf(stderr, "input error\n");
+        exit(-1);
+    }
+    void** grid = malloc(sizeof(void*)*num);
+
+    for(size_t i = 0; i < (size_t)num; ++i)
+        grid[i] = gridformat_reader(input_file_name[i]);
+    printf("%d\n", num);
+    void* out_grid = copy_grid_format(grid[0]);
+    sub_grids(out_grid, grid[0], grid[1]);
+
+    gridformat_writer(output_file_name, out_grid); 
+    for(size_t i = 0; i < (size_t)num; ++i)
+    {
+        grid_destroy(grid[i]);
+        free(input_file_name[i]);
+    }
+    free(input_file_name);
+    free(grid);
+    grid_destroy(out_grid);
+    free(output_file_name);
+   
+    return 0;
+}
diff --git a/grid_tools/sum.c b/grid_tools/sum.c
new file mode 100644
index 0000000000000000000000000000000000000000..a51975cef677771eefe81792f368dea368cfc9ca
--- /dev/null
+++ b/grid_tools/sum.c
@@ -0,0 +1,74 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+#include "grid_reader.h"
+
+static void parse_input(char*** input, int* num, char** args)
+{
+    size_t size = 4;
+    *input = (char**)malloc(size*sizeof(char*));
+    char** tmp = args; 
+    size_t count = 0;
+    while(*tmp != NULL)
+    {
+        (*input)[count++] = strdup(*tmp);
+        if(count==size)
+        {
+            size <<= 1;
+            *input = (char**)realloc(*input, size*sizeof(char*));
+        }
+        tmp++;
+        if(strcmp(*tmp, "-o") == 0)
+            break;
+    }
+    (*input)[count] = NULL;
+    *num = count;
+}
+
+static void parse_string(char** argv, char*** input, 
+int* num, char** output)
+{
+    char** ptr = argv;
+    while(*ptr != NULL)
+    {
+        if(strcmp(*ptr, "-i") == 0)
+        {
+            parse_input(input, num, ++ptr);
+        }
+        else if(strcmp(*ptr, "-o") == 0)
+        {
+            *output = strdup(*(++ptr));
+        }
+        else
+            ++ptr;
+    }
+}
+
+int main(int argc, char** argv)
+{
+    char** input_file_name=NULL;
+    char* output_file_name=NULL;
+    int num = 0;
+    parse_string(argv, &input_file_name, &num, &output_file_name);
+    void** grid = malloc(sizeof(void*)*num);
+
+    for(size_t i = 0; i < (size_t)num; ++i)
+        grid[i] = gridformat_reader(input_file_name[i]);
+    printf("%d\n", num);
+    void* out_grid = copy_grid_format(grid[0]);
+    sum_grids(out_grid, num, grid);
+
+    gridformat_writer(output_file_name, out_grid); 
+    for(size_t i = 0; i < (size_t)num; ++i)
+    {
+        grid_destroy(grid[i]);
+        free(input_file_name[i]);
+    }
+    free(input_file_name);
+    free(grid);
+    grid_destroy(out_grid);
+    free(output_file_name);
+   
+    return 0;
+}
diff --git a/grid_tools/sum_to_scalar.c b/grid_tools/sum_to_scalar.c
new file mode 100644
index 0000000000000000000000000000000000000000..1be9339b274e4a01296c22dbe512a1c9ee78df7d
--- /dev/null
+++ b/grid_tools/sum_to_scalar.c
@@ -0,0 +1,26 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include "grid_reader.h"
+double sum(void* src)
+{
+    double* data = get_grid_data(src);
+    size_t size = get_size(src);
+    double** delta = get_grid_basis(src);
+    double dv = delta[0][0]*delta[1][1]*delta[2][2];
+    double f = 0.;
+    for(size_t i = 0; i < size; ++i)
+    {
+        f += data[i]*dv;
+    } 
+    return f;
+}
+
+int main(int argc, const char** argv)
+{
+    char* input_file_name=argv[1];
+    void* grid;
+    grid = gridformat_reader(input_file_name);
+    printf("%lf\n", sum(grid));
+    grid_destroy(grid);
+    return 0;
+}