basic integration method and functions added
[physik/posic.git] / moldyn.c
index 57ae62f..08901c7 100644 (file)
--- a/moldyn.c
+++ b/moldyn.c
@@ -14,6 +14,7 @@
 #include "math/math.h"
 #include "init/init.h"
 #include "random/random.h"
+#include "visual/visual.h"
 
 
 int create_lattice(unsigned char type,int element,double mass,double lc,
@@ -177,6 +178,76 @@ t_3dvec get_total_p(t_atom *atom, int count) {
 }
 
 
+/*
+ *
+ * 'integration of newtons equation' - algorithms
+ *
+ */
+
+/* start the integration */
+
+int moldyn_integrate(t_moldyn *moldyn) {
+
+       int i;
+
+       /* calculate initial forces */
+       moldyn->force(moldyn);
+
+       for(i=0;i<moldyn->time_steps;i++) {
+               /* integration step */
+               moldyn->integrate(moldyn);
+
+               /* check for visualiziation */
+               // to be continued ...
+               if(!(i%100)) 
+                       visual_atoms(moldyn->visual,i*moldyn->tau,
+                                    moldyn->atom,moldyn->count);
+       }
+
+       return 0;
+}
+
+/* velocity verlet */
+
+int velocity_verlet(t_moldyn *moldyn) {
+
+       int i,count;
+       double tau,tau_square;
+       t_3dvec delta;
+       t_atom *atom;
+
+       atom=moldyn->atom;
+       count=moldyn->count;
+       tau=moldyn->tau;
+
+       tau_square=tau*tau;
+
+       for(i=0;i<count;i++) {
+               /* new positions */
+               v3_scale(&delta,&(atom[i].v),tau);
+               v3_add(&(atom[i].r),&(atom[i].r),&delta);
+               v3_scale(&delta,&(atom[i].f),0.5*tau_square/atom[i].mass);
+               v3_add(&(atom[i].r),&(atom[i].r),&delta);
+               v3_per_bound(&(atom[i].r),&(moldyn->dim));
+
+               /* velocities */
+               v3_scale(&delta,&(atom[i].f),0.5*tau/atom[i].mass);
+               v3_add(&(atom[i].r),&(atom[i].r),&delta);
+       }
+
+       /* forces depending on chosen potential */
+       moldyn->force(moldyn);
+
+       for(i=0;i<count;i++) {
+               /* again velocities */
+               v3_scale(&delta,&(atom[i].f),0.5*tau/atom[i].mass);
+               v3_add(&(atom[i].v),&(atom[i].v),&delta);
+       }
+
+       return 0;
+}
+
+
 /*
  *
  * potentials & corresponding forces