Skip to content
Snippets Groups Projects
lenard_jones_kernel1.c 2.56 KiB
#include "lenard_jones_kernel1.h"
#include <stdlib.h>
#include <math.h>
#include <stdio.h>
#include <string.h>
struct lenard_jones_kernel1
{
    double sigma; 
    double epsilon;
    double cutoff;
};

void* lenard_jones_create1(char* name)
{
    void* src = malloc(sizeof(lenard_jones_kernel1));
    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, "Sigma") == 0)
         {
             tmp = strtok(NULL, " ");
             if(tmp != NULL)
                 ((lenard_jones_kernel1*)src)->sigma = atof(tmp);
             else
             {
                 printf("Error formating\n");
                 free(src);
                 return NULL;
             }
         }
         else if(strcmp(tmp, "Epsilon") == 0)
         {
             tmp = strtok(NULL, " ");
             if(tmp != NULL)
                 ((lenard_jones_kernel1*)src)->epsilon = atof(tmp);
             else
             {
                 printf("Error formating\n");
                 free(src);
                 return NULL;
             }
         }
         else if(strcmp(tmp, "Cutoff") == 0)
         {
             tmp = strtok(NULL, " ");
             if(tmp != NULL)
                 ((lenard_jones_kernel1*)src)->cutoff = atof(tmp);
             else
             {
                 printf("Error formating\n");
                 free(src);
                 return NULL;
             }
         }
         else
         {
             printf("Unrecognized pattern\n");
             free(src);
             return NULL;
         }
    }
    fclose(infile);
    return src;
}

double lenard_jones_compute1(size_t i, size_t j, size_t k, double* origin, double** basis, void* src)
{
    lenard_jones_kernel1* kernel = (lenard_jones_kernel1*)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 = pos[0] * pos[0] + pos[1] * pos[1] + pos[2] * pos[2];
    d = sqrt(d);
    if(d > 0. && d <= kernel->cutoff*kernel->sigma)
    {
        d = kernel->sigma / d;
        d = d*d*d*d*d*d;
        //double e = -(kernel->c6)/d+(kernel->c12)/(d*d);
        double e = kernel->epsilon*4.*d*(d-1.);
        return (e>40.) ? 40. : e;
    }
    else if(d > kernel->cutoff*kernel->sigma)
        return 0.;
    else
    {
        return 40.;
    }
}

void lenard_jones_destroy1(void* src)
{
    free(src);
}