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