From 9ae5e8af9192b47fba3743ab7f4ef6d0c34d507d Mon Sep 17 00:00:00 2001 From: hackbard Date: Mon, 20 Mar 2006 07:52:03 +0000 Subject: [PATCH] initial checkin --- posic.c | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ posic.h | 54 ++++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 posic.c create mode 100644 posic.h diff --git a/posic.c b/posic.c new file mode 100644 index 0000000..006fd99 --- /dev/null +++ b/posic.c @@ -0,0 +1,154 @@ +/* + * posic.c - precipitation process of silicon carbide in silicon + * + * author: Frank Zirkelbach + * + */ + +#include "posic.h" + +#define RAND(max) (max*(0.5-(1.0*rand()/RAND_MAX+1))); + +int main(int argc,char **argv) { + + t_atom *si; + //t_si *c; + int i,j,runs,amount_si; + double time; + int fd; + + double tau,tau2,m,m2; + double deltax,deltay,deltaz,distance; + double deltax2,deltay2,deltaz2,tmp; + double lj1,lj2,lj; + + /* silicon */ + amount_si=AMOUNT_SI; + printf("simulating %d silicon atoms\n",amount_si); + si=malloc(amount_si*sizeof(t_atom)); + if(!si) { + perror("silicon malloc"); + return -1; + } + memset(si,0,amount_si*sizeof(t_atom)); + m=SI_M; m2=2.0*m; + + /* init */ + printf("placing silicon atoms\n"); + for(i=0;iLX) si[i].x-=LEN_X; + else if(si[i].x<-LX) si[i].x+=LEN_X; + si[i].y+=(tau2*si[i].fy/m2); + if(si[i].y>LY) si[i].y-=LEN_Y; + else if(si[i].y<-LY) si[i].y+=LEN_Y; + si[i].z+=(tau2*si[i].fz/m2); + if(si[i].z>LZ) si[i].z-=LEN_Z; + else if(si[i].z<-LZ) si[i].z+=LEN_Z; + /* calculation of velocities v(t+h/2) */ + si[i].vx+=(tau*si[i].fx/m2); + si[i].vy+=(tau*si[i].fy/m2); + si[i].vz+=(tau*si[i].fz/m2); + } + for(i=0;iLX) deltax-=LEN_X; + else if(-deltax>LX) deltax+=LEN_X; + deltax2=deltax*deltax; + deltay=si[i].y-si[j].y; + if(deltay>LY) deltay-=LEN_Y; + else if(-deltay>LY) deltay+=LEN_Y; + deltay2=deltay*deltay; + deltaz=si[i].z-si[j].z; + if(deltaz>LZ) deltaz-=LEN_Z; + else if(-deltaz>LZ) deltaz+=LEN_Z; + deltaz2=deltaz*deltaz; + distance=deltax2+deltay2+deltaz2; + if(distance<=R2_CUTOFF) { + tmp=1.0/distance; // 1/r^2 + lj1=tmp; // 1/r^2 + tmp*=tmp; // 1/r^4 + lj1*=tmp; // 1/r^6 + tmp*=tmp; // 1/r^8 + lj2=tmp; // 1/r^8 + lj1*=tmp; // 1/r^14 + lj1*=LJ_SIGMA_12; + lj2*=LJ_SIGMA_06; + lj=-2*lj1+lj2; + si[i].fx=lj*deltax; + si[i].fy=lj*deltay; + si[i].fz=lj*deltaz; + si[i].fx=-lj*deltax; + si[i].fy=-lj*deltay; + si[i].fz=-lj*deltaz; + } + } + /* calculation of new velocities v(t+h) */ + si[i].vx+=(tau*si[i].fx/m2); + si[i].vy+=(tau*si[i].fy/m2); + si[i].vz+=(tau*si[i].fz/m2); + } + + time+=tau; + + /* print out positions in rasmol format */ + dprintf(fd,"%d\nTime %f\n",amount_si,time); + for(i=0;i + * + */ + +#define _GNU_SOURCE +#include +#include +#include +#include +#include +#include +#include + +#ifndef POSIC_H +#define POSIC_H + +#define LEN_X 5 +#define LX (1.0*LEN_X/2) +#define LEN_Y 5 +#define LY (1.0*LEN_Y/2) +#define LEN_Z 5 +#define LZ (1.0*LEN_Z/2) + +#define RUNS 1000 +#define TAU 0.001 + +#define R_CUTOFF 2 +#define R2_CUTOFF (R_CUTOFF*R_CUTOFF) + +#define SI_M 1 +#define SI_LC 0.543105 +#define LJ_SIGMA SI_LC +#define LJ_SIGMA_02 (LJ_SIGMA*LJ_SIGMA) +#define LJ_SIGMA_06 (LJ_SIGMA_02*LJ_SIGMA_02*LJ_SIGMA_02) +#define LJ_SIGMA_12 (LJ_SIGMA_06*LJ_SIGMA_06) + +#define AMOUNT_SI ((LEN_X/SI_LC)*(LEN_Y/SI_LC)*(LEN_Z/SI_LC)*2) + +typedef struct s_atom { + double x; + double y; + double z; + double vx; + double vy; + double vz; + double fx; + double fy; + double fz; +} t_atom; + +#endif -- 2.20.1