fixed sign
[physik/posic.git] / sic.c
1 /*
2  * sic.c - investigation of the sic precipitation process of silicon carbide
3  *
4  * author: Frank Zirkelbach <frank.zirkelbach@physik.uni-augsburg.de>
5  *
6  */
7
8 #include <math.h>
9  
10 #include "moldyn.h"
11 #include "posic.h"
12
13 /* potential */
14 #include "potentials/harmonic_oscillator.h"
15 #include "potentials/lennard_jones.h"
16 #include "potentials/tersoff.h"
17 //#include "potentials/tersoff_orig.h"
18
19 #define INJECT          1
20 #define NR_ATOMS        4
21
22 int hook(void *moldyn,void *hook_params) {
23
24         t_moldyn *md;
25         t_3dvec r,v,dist;
26         double d;
27         unsigned char run;
28         int i,j;
29         t_atom *atom;
30
31         md=moldyn;
32
33         printf("\nschedule hook: ");
34
35         if(!(md->schedule.count%2)) {
36                 /* add carbon at random place, and enable t scaling */
37                 for(j=0;j<NR_ATOMS;j++) {
38                 run=1;
39                 while(run) {
40                         r.x=rand_get_double(&(md->random))*md->dim.x;
41                         r.y=rand_get_double(&(md->random))*md->dim.y;
42                         r.z=rand_get_double(&(md->random))*md->dim.z;
43                         for(i=0;i<md->count;i++) {
44                                 atom=&(md->atom[i]);
45                                 v3_sub(&dist,&(atom->r),&r);
46                                 d=v3_absolute_square(&dist);
47                                 if(d>TM_R_C)
48                                         run=0;
49                         }
50                 }
51                 v.x=0; v.y=0; v.z=0;
52                 add_atom(md,C,M_C,1,
53                          ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP|ATOM_ATTR_HB,
54                          &r,&v);
55                 }
56                 printf("adding atoms & enable t scaling\n");
57                 set_pt_scale(md,0,0,T_SCALE_BERENDSEN,100.0);
58         }
59         else {
60                 /* disable t scaling */
61                 printf("disabling t scaling\n");
62                 set_pt_scale(md,0,0,0,0);
63         }
64
65         return 0;
66 }
67
68 int main(int argc,char **argv) {
69
70         /* check argv */
71         if(argc!=3) {
72                 printf("[sic] usage: %s <logdir> <temperatur>\n",argv[0]);
73                 return -1;
74         }
75
76         /* main moldyn structure */
77         t_moldyn md;
78
79         /* potential parameters */
80         t_lj_params lj;
81         t_ho_params ho;
82         t_tersoff_mult_params tp;
83
84         /* atom injection counter */
85         int inject;
86
87         /* testing location & velocity vector */
88         t_3dvec r,v;
89         memset(&r,0,sizeof(t_3dvec));
90         memset(&v,0,sizeof(t_3dvec));
91
92         /* initialize moldyn */
93         moldyn_init(&md,argc,argv);
94
95         /* choose integration algorithm */
96         set_int_alg(&md,MOLDYN_INTEGRATE_VERLET);
97
98         /* choose potential */
99         set_potential1b(&md,tersoff_mult_1bp);
100         set_potential2b(&md,tersoff_mult_2bp);
101         //set_potential3b_j1(&md,tersoff_mult_2bp);
102         //set_potential3b_k1(&md,tersoff_mult_3bp);
103         //set_potential3b_j3(&md,tersoff_mult_post_2bp);
104         set_potential3b_j1(&md,tersoff_mult_3bp_j1);
105         set_potential3b_k1(&md,tersoff_mult_3bp_k1);
106         set_potential3b_j2(&md,tersoff_mult_3bp_j2);
107         set_potential3b_k2(&md,tersoff_mult_3bp_k2);
108         //set_potential2b(&md,lennard_jones);
109         //set_potential2b(&md,harmonic_oscillator);
110         set_potential_params(&md,&tp);
111         //set_potential_params(&md,&lj);
112         //set_potential_params(&md,&ho);
113
114         /* cutoff radius */
115         set_cutoff(&md,TM_S_SI);
116         //set_cutoff(&md,LC_SI*sqrt(3.0));
117         //set_cutoff(&md,2.0*LC_SI);
118
119         /*
120          * potential parameters
121          */
122
123         /* lennard jones */
124         lj.sigma6=LJ_SIGMA_SI*LJ_SIGMA_SI*LJ_SIGMA_SI;
125         lj.sigma6*=lj.sigma6;
126         lj.sigma12=lj.sigma6*lj.sigma6;
127         lj.epsilon4=4.0*LJ_EPSILON_SI;
128         lj.uc=lj.epsilon4*(lj.sigma12/pow(md.cutoff,12.0)-lj.sigma6/pow(md.cutoff,6));
129
130         /* harmonic oscillator */
131         ho.equilibrium_distance=0.25*sqrt(3.0)*LC_SI;
132         //ho.equilibrium_distance=LC_SI;
133         ho.spring_constant=LJ_EPSILON_SI;
134
135         /*
136          * tersoff mult potential parameters for SiC
137          */
138         tp.S[0]=TM_S_SI;
139         tp.R[0]=TM_R_SI;
140         tp.A[0]=TM_A_SI;
141         tp.B[0]=TM_B_SI;
142         tp.lambda[0]=TM_LAMBDA_SI;
143         tp.mu[0]=TM_MU_SI;
144         tp.beta[0]=TM_BETA_SI;
145         tp.n[0]=TM_N_SI;
146         tp.c[0]=TM_C_SI;
147         tp.d[0]=TM_D_SI;
148         tp.h[0]=TM_H_SI;
149
150         tp.S[1]=TM_S_C;
151         tp.R[1]=TM_R_C;
152         tp.A[1]=TM_A_C;
153         tp.B[1]=TM_B_C;
154         tp.lambda[1]=TM_LAMBDA_C;
155         tp.mu[1]=TM_MU_C;
156         tp.beta[1]=TM_BETA_C;
157         tp.n[1]=TM_N_C;
158         tp.c[1]=TM_C_C;
159         tp.d[1]=TM_D_C;
160         tp.h[1]=TM_H_C;
161
162         tp.chi=TM_CHI_SIC;
163
164         tersoff_mult_complete_params(&tp);
165
166         /* set (initial) dimensions of simulation volume */
167         set_dim(&md,6*LC_SI,6*LC_SI,6*LC_SI,TRUE);
168
169         /* set periodic boundary conditions in all directions */
170         set_pbc(&md,TRUE,TRUE,TRUE);
171
172         /* create the lattice / place atoms */
173         //create_lattice(&md,CUBIC,LC_SI,SI,M_SI,
174         //create_lattice(&md,FCC,LC_SI,SI,M_SI,
175         create_lattice(&md,DIAMOND,LC_SI,SI,M_SI,
176                        ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP|ATOM_ATTR_HB,
177         //               ATOM_ATTR_2BP|ATOM_ATTR_HB,
178                        0,6,6,6);
179         moldyn_bc_check(&md);
180
181         /* testing configuration */
182         //r.x=0.27*sqrt(3.0)*LC_SI/2.0; v.x=0;
183         //r.x=(TM_S_SI+TM_R_SI)/4.0;    v.x=0;
184         //r.y=0;                v.y=0;
185         //r.z=0;                v.z=0;
186         //add_atom(&md,SI,M_SI,0,
187         //           ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP|ATOM_ATTR_HB,
188         //           ATOM_ATTR_2BP|ATOM_ATTR_HB,
189         //           &r,&v);
190         //r.x=-r.x;     v.x=-v.x;
191         //r.y=0;                v.y=0;
192         //r.z=0;                v.z=0;
193         //add_atom(&md,SI,M_SI,0,
194         //           ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP|ATOM_ATTR_HB,
195         //           ATOM_ATTR_2BP|ATOM_ATTR_HB,
196         //           &r,&v);
197         //r.z=0.27*sqrt(3.0)*LC_SI/2.0; v.z=0;
198         //r.x=(TM_S_SI+TM_R_SI)/4.0;    v.x=0;
199         //r.y=0;                v.y=0;
200         //r.x=0;                v.x=0;
201         //add_atom(&md,SI,M_SI,0,
202         //           ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP|ATOM_ATTR_HB,
203         //           ATOM_ATTR_2BP|ATOM_ATTR_HB,
204         //           &r,&v);
205         //r.z=-r.z;     v.z=-v.z;
206         //r.y=0;                v.y=0;
207         //r.x=0;                v.x=0;
208         //add_atom(&md,SI,M_SI,0,
209         //           ATOM_ATTR_1BP|ATOM_ATTR_2BP|ATOM_ATTR_3BP|ATOM_ATTR_HB,
210         //           ATOM_ATTR_2BP|ATOM_ATTR_HB,
211         //           &r,&v);
212
213         /* set temperature & pressure */
214         set_temperature(&md,atof(argv[2])+273.0);
215         set_pressure(&md,BAR);
216
217         /* set p/t scaling */
218         //set_pt_scale(&md,P_SCALE_BERENDSEN,0.001,
219         //                 T_SCALE_BERENDSEN,100.0);
220         //set_pt_scale(&md,0,0,T_SCALE_DIRECT,1.0);
221         //set_pt_scale(&md,P_SCALE_BERENDSEN,0.001,0,0);
222         
223         /* initial thermal fluctuations of particles (in equilibrium) */
224         thermal_init(&md,TRUE);
225
226         /* create the simulation schedule */
227         /* initial configuration */
228         moldyn_add_schedule(&md,10000,1.0);
229         /* adding atoms */
230         //for(inject=0;inject<INJECT;inject++) {
231         //      /* injecting atom and run with enabled t scaling */
232         //      moldyn_add_schedule(&md,900,1.0);
233         //      /* continue running with disabled t scaling */
234         //      moldyn_add_schedule(&md,1100,1.0);
235         //}
236
237         /* schedule hook function */
238         moldyn_set_schedule_hook(&md,&hook,NULL);
239
240         /* activate logging */
241         moldyn_set_log_dir(&md,argv[1]);
242         moldyn_set_report(&md,"Frank Zirkelbach","Test 1");
243         moldyn_set_log(&md,LOG_TOTAL_ENERGY,1);
244         moldyn_set_log(&md,LOG_TEMPERATURE,1);
245         moldyn_set_log(&md,LOG_PRESSURE,1);
246         moldyn_set_log(&md,VISUAL_STEP,100);
247         moldyn_set_log(&md,SAVE_STEP,100);
248         moldyn_set_log(&md,CREATE_REPORT,0);
249
250         /*
251          * let's do the actual md algorithm now
252          *
253          * integration of newtons equations
254          */
255         moldyn_integrate(&md);
256
257         /* close */
258         moldyn_shutdown(&md);
259         
260         return 0;
261 }
262