From d6e3280f884f61fb020dc3f94dd99c869f941f5c Mon Sep 17 00:00:00 2001
From: Han-Yi Chou <hchou10@illinois.edu>
Date: Mon, 8 Oct 2018 14:50:26 -0500
Subject: [PATCH] Fix a writer bug, the older one did not truncate the file.
 Add several lenard-jones type interaction

---
 GridDxFormat/grid_reader.c             |  14 ++-
 Kernel/debye_huckel_kernel.c           |   3 +-
 Kernel/lenard_jones_kernel.c           |   4 +-
 Kernel/lenard_jones_repulsion_kernel.c |  94 +++++++++++++++++++
 Kernel/lenard_jones_trunc_kernel.c     | 123 +++++++++++++++++++++++++
 inc/grid_reader.h                      |   1 +
 inc/lenard_jones_repulsion_kernel.h    |  14 +++
 inc/lenard_jones_trunc_kernel.h        |  14 +++
 main.c                                 |   2 +-
 9 files changed, 264 insertions(+), 5 deletions(-)
 create mode 100644 Kernel/lenard_jones_repulsion_kernel.c
 create mode 100644 Kernel/lenard_jones_trunc_kernel.c
 create mode 100644 inc/lenard_jones_repulsion_kernel.h
 create mode 100644 inc/lenard_jones_trunc_kernel.h

diff --git a/GridDxFormat/grid_reader.c b/GridDxFormat/grid_reader.c
index 990ab14..909a77a 100644
--- a/GridDxFormat/grid_reader.c
+++ b/GridDxFormat/grid_reader.c
@@ -232,7 +232,7 @@ int gridformat_writer(char* name, void* src)
     printf("Starting writing files %s\n", name);
     assert(src);
     grid* g = (grid*)src;
-    int fildes = open(name, O_RDWR | O_CREAT, 0664);
+    int fildes = open(name, O_RDWR | O_CREAT | O_TRUNC, 0664);
     if(fildes == -1)
     {
         perror("Error in opeing file for writing");
@@ -571,3 +571,15 @@ void* copy_grid_format(void* ptr)
     }
     return dest;   
 }
+
+void sum_grids(void* dest, int num, void** src)
+{
+    grid** in = (grid**)src;
+    grid* out = (grid*)dest;
+    for(size_t idx = 0; idx < out->size; idx++)
+    {
+        out->data[idx] = 0.;
+        for(size_t i = 0; i < (size_t)num; ++i)
+            out->data[idx] += in[i]->data[idx];
+    }
+}
diff --git a/Kernel/debye_huckel_kernel.c b/Kernel/debye_huckel_kernel.c
index 1e97d9e..b7f840f 100644
--- a/Kernel/debye_huckel_kernel.c
+++ b/Kernel/debye_huckel_kernel.c
@@ -64,7 +64,8 @@ double debye_huckel_compute(size_t i, size_t j, size_t k, double* origin, double
     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]);    
-    return exp(-d/kernel->screen_length)/(d+kernel->shift);   
+    double e = exp(-d/kernel->screen_length)/(d+kernel->shift);  
+    return (e > 100) ? 100: e;
 }
 
 void debye_huckel_destroy(void* src)
diff --git a/Kernel/lenard_jones_kernel.c b/Kernel/lenard_jones_kernel.c
index f789212..12a7e48 100644
--- a/Kernel/lenard_jones_kernel.c
+++ b/Kernel/lenard_jones_kernel.c
@@ -68,11 +68,11 @@ double lenard_jones_compute(size_t i, size_t j, size_t k, double* origin, double
     if(d > 0.)
     {
         double e = -(kernel->c6)/d+(kernel->c12)/(d*d);
-        return (e>20) ? 20 : e;
+        return (e>100) ? 100 : e;
     }
     else
     {
-        return 20;
+        return 100;
     }
 }
 
diff --git a/Kernel/lenard_jones_repulsion_kernel.c b/Kernel/lenard_jones_repulsion_kernel.c
new file mode 100644
index 0000000..735c45e
--- /dev/null
+++ b/Kernel/lenard_jones_repulsion_kernel.c
@@ -0,0 +1,94 @@
+#include "lenard_jones_repulsion_kernel.h"
+#include <stdlib.h>
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+struct lenard_jones_repulsion_kernel
+{
+    double c6; 
+    double c12;
+};
+
+void* lenard_jones_repulsion_create(char* name)
+{
+    void* src = malloc(sizeof(lenard_jones_repulsion_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_repulsion_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_repulsion_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_repulsion_compute(size_t i, size_t j, size_t k, double* origin, double** basis, void* src)
+{
+    lenard_jones_repulsion_kernel* kernel = (lenard_jones_repulsion_kernel*)src;
+
+    double sigma2 = pow(kernel->c12/kernel->c6,0.33333333333333333333);
+    double epsilon = kernel->c6*kernel->c6/(4*kernel->c12);
+
+    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 d2 = pos[0] * pos[0] + pos[1] * pos[1] + pos[2] * pos[2];
+    double e;
+
+    if(d2<=pow(2.,0.33333333333333333)*sigma2)
+    {
+        d2=d2*d2*d2;
+        if(d2 > 0.)
+        {
+            e = (-(kernel->c6)/d2+(kernel->c12)/(d2*d2))+epsilon;
+            return (e>100) ? 100 : e;
+        }
+        else
+        {
+            return 100;
+        }
+    }
+    else
+        return 0;
+}
+
+void lenard_jones_repulsion_destroy(void* src)
+{
+    free(src);
+}
diff --git a/Kernel/lenard_jones_trunc_kernel.c b/Kernel/lenard_jones_trunc_kernel.c
new file mode 100644
index 0000000..e5dad1c
--- /dev/null
+++ b/Kernel/lenard_jones_trunc_kernel.c
@@ -0,0 +1,123 @@
+#include "lenard_jones_trunc_kernel.h"
+#include <stdlib.h>
+#include <math.h>
+#include <stdio.h>
+#include <string.h>
+struct lenard_jones_trunc_kernel
+{
+    double c6; 
+    double c12;
+    double scaling;
+};
+
+void* lenard_jones_trunc_create(char* name)
+{
+    void* src = malloc(sizeof(lenard_jones_trunc_kernel));
+    FILE* infile = fopen(name, "r");
+    if(infile == NULL)
+    {
+        perror("Error in opening file:");
+        free(src);
+        return NULL;
+    }
+    char buffer[512];
+    ((lenard_jones_trunc_kernel*)src)->c6 = 0.;
+    ((lenard_jones_trunc_kernel*)src)->c12 = 0.;
+    ((lenard_jones_trunc_kernel*)src)->scaling = 1.; 
+    while(fgets(buffer, 512, infile) != NULL)
+    {
+         char* tmp = strtok(buffer, " ");
+         if(strcmp(tmp, "C6") == 0)
+         {
+             tmp = strtok(NULL, " ");
+             if(tmp != NULL)
+                 ((lenard_jones_trunc_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_trunc_kernel*)src)->c12 = atof(tmp);
+             else
+             {
+                 printf("Error formating\n");
+                 free(src);
+                 return NULL;
+             }
+         }
+         else if(strcmp(tmp, "Scaling") == 0)
+         {
+             tmp = strtok(NULL, " ");
+             if(tmp != NULL)
+                 ((lenard_jones_trunc_kernel*)src)->scaling = atof(tmp);
+             else
+             {
+                 printf("Error formating\n");
+                 free(src);
+                 return NULL;
+             }
+         }
+         else
+         {
+             printf("Unrecognized pattern\n");
+             free(src);
+             return NULL;
+         }
+    }
+    ((lenard_jones_trunc_kernel*)src)->c6 /= ((lenard_jones_trunc_kernel*)src)->scaling;
+    ((lenard_jones_trunc_kernel*)src)->c12 /= ((lenard_jones_trunc_kernel*)src)->scaling;
+    return src;
+}
+
+double lenard_jones_trunc_compute(size_t i, size_t j, size_t k, double* origin, double** basis, void* src)
+{
+    lenard_jones_trunc_kernel* kernel = (lenard_jones_trunc_kernel*)src;
+
+    double sigma2 = pow(kernel->c12/kernel->c6,0.33333333333333333333);
+    double epsilon = kernel->c6*kernel->c6/(4*kernel->c12);
+
+    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 d2 = pos[0] * pos[0] + pos[1] * pos[1] + pos[2] * pos[2];
+    double e;
+    double rc2 = 2.5*2.5*sigma2;
+    //rc2 = rc2*rc2*rc2;
+
+    //d2 = d2*d2*d2;
+
+    if(d2<=pow(2.,0.33333333333333333)*sigma2)
+    {
+        d2=d2*d2*d2;
+        rc2=rc2*rc2*rc2;
+        if(d2 > 0.)
+        {
+            e = 2.*(-(kernel->c6)/d2+(kernel->c12)/(d2*d2))+epsilon-((-kernel->c6)/rc2+(kernel->c12)/(rc2*rc2));
+            return (e>200) ? 200 : e;
+        }
+        else
+        {
+            return 200;
+        }
+    }
+    else if(d2>rc2)
+        return 0;
+    else
+    {
+        d2=d2*d2*d2;
+        rc2=rc2*rc2*rc2;
+        return -(kernel->c6)/d2+(kernel->c12)/(d2*d2)-((-kernel->c6)/rc2+(kernel->c12)/(rc2*rc2));
+    }
+}
+
+void lenard_jones_trunc_destroy(void* src)
+{
+    free(src);
+}
diff --git a/inc/grid_reader.h b/inc/grid_reader.h
index 9b97394..e5c04d8 100644
--- a/inc/grid_reader.h
+++ b/inc/grid_reader.h
@@ -17,4 +17,5 @@ void* copy_grid_format(void*);
 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);
 #endif
diff --git a/inc/lenard_jones_repulsion_kernel.h b/inc/lenard_jones_repulsion_kernel.h
new file mode 100644
index 0000000..b4071bc
--- /dev/null
+++ b/inc/lenard_jones_repulsion_kernel.h
@@ -0,0 +1,14 @@
+#ifdef KERNEL_TYPE
+ComputeType(lenard_jones_repulsion, lenard_jones_repulsion_compute);
+CreateType(lenard_jones_repulsion, lenard_jones_repulsion_create);
+DestroyType(lenard_jones_repulsion, lenard_jones_repulsion_destroy);
+#else
+#ifndef LENARD_JONES_REPULSION_H_
+#define LENARD_JONES_REPULSION_H_
+#include <stddef.h>
+typedef struct lenard_jones_repulsion_kernel lenard_jones_repulsion_kernel;
+void* lenard_jones_repulsion_create(char* name);
+double lenard_jones_repulsion_compute(size_t i, size_t j, size_t k, double* origin, double** basis, void* src);
+void lenard_jones_repulsion_destroy(void*);
+#endif
+#endif
diff --git a/inc/lenard_jones_trunc_kernel.h b/inc/lenard_jones_trunc_kernel.h
new file mode 100644
index 0000000..081e754
--- /dev/null
+++ b/inc/lenard_jones_trunc_kernel.h
@@ -0,0 +1,14 @@
+#ifdef KERNEL_TYPE
+ComputeType(lenard_jones_trunc, lenard_jones_trunc_compute);
+CreateType(lenard_jones_trunc, lenard_jones_trunc_create);
+DestroyType(lenard_jones_trunc, lenard_jones_trunc_destroy);
+#else
+#ifndef LENARD_JONES_TRUNC_H_
+#define LENARD_JONES_TRUNC_H_
+#include <stddef.h>
+typedef struct lenard_jones_trunc_kernel lenard_jones_trunc_kernel;
+void* lenard_jones_trunc_create(char* name);
+double lenard_jones_trunc_compute(size_t i, size_t j, size_t k, double* origin, double** basis, void* src);
+void lenard_jones_trunc_destroy(void*);
+#endif
+#endif
diff --git a/main.c b/main.c
index 57d5934..915ab66 100644
--- a/main.c
+++ b/main.c
@@ -91,7 +91,7 @@ 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);
+    //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));
 
-- 
GitLab