regular checkin of logfile
[physik/posic.git] / potentials / tersoff.c
index b83bfd6..5039ff7 100644 (file)
@@ -24,6 +24,12 @@ int tersoff_mult_set_params(t_moldyn *moldyn,int element1,int element2) {
 
        t_tersoff_mult_params *p;
 
+       // set cutoff before parameters (actually only necessary for some pots)
+       if(moldyn->cutoff==0.0) {
+               printf("[tersoff] WARNING: no cutoff!\n");
+               return -1;
+       }
+
        /* alloc mem for potential parameters */
         moldyn->pot_params=malloc(sizeof(t_tersoff_mult_params));
         if(moldyn->pot_params==NULL) {
@@ -218,7 +224,8 @@ int tersoff_mult_2bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) {
 
        /* add forces */
        v3_add(&(ai->f),&(ai->f),&force);
-       v3_sub(&(aj->f),&(aj->f),&force); // reason: dri rij = - drj rij
+       v3_scale(&force,&force,-1.0); // reason: dri rij = - drj rij
+       v3_add(&(aj->f),&(aj->f),&force);
 
 #ifdef DEBUG
        if((ai==&(moldyn->atom[0]))|(aj==&(moldyn->atom[0]))) {
@@ -232,7 +239,7 @@ int tersoff_mult_2bp(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) {
 #endif
 
        /* virial */
-       virial_calc(ai,&force,&dist_ij);
+       virial_calc(aj,&force,&dist_ij);
 
        /* energy 2bp contribution */
        energy=f_r*f_c;
@@ -478,7 +485,8 @@ int tersoff_mult_3bp_j2(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) {
        scale=-0.5*(f_c*(df_r+b*df_a)+df_c*(f_r+b*df_a));
        v3_scale(&force,&(exchange->dist_ij),scale);
        v3_add(&(ai->f),&(ai->f),&force);
-       v3_sub(&(aj->f),&(aj->f),&force); // dri rij = - drj rij
+       v3_scale(&force,&force,-1.0); // dri rij = - drj rij
+       v3_add(&(aj->f),&(aj->f),&force);
 
 #ifdef DEBUG
        if((ai==&(moldyn->atom[0]))|(aj==&(moldyn->atom[0]))) {
@@ -495,8 +503,7 @@ int tersoff_mult_3bp_j2(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) {
 #endif
 
        /* virial */
-       if(aj<ai)
-               virial_calc(ai,&force,&(exchange->dist_ij));
+       virial_calc(aj,&force,&(exchange->dist_ij));
 
        /* dzeta prefactor = - 0.5 f_c f_a db */
        exchange->pre_dzeta=-0.5*f_a*f_c*db;
@@ -605,9 +612,6 @@ int tersoff_mult_3bp_k2(t_moldyn *moldyn,
        }
 #endif
 
-       /* virial */
-       //virial_calc(ai,&force,&dist_ij);
-
        /* derivative wrt j */
        v3_scale(&force,&dcosdrj,fcdg*pre_dzeta);
 
@@ -623,9 +627,8 @@ int tersoff_mult_3bp_k2(t_moldyn *moldyn,
 #endif
 
        /* virial */
-       //v3_scale(&force,&force,-1.0);
-       if(aj<ai)
-               virial_calc(ai,&force,&dist_ij);
+       v3_scale(&force,&force,-1.0);
+       virial_calc(ai,&force,&dist_ij);
 
        /* derivative wrt k */
        v3_scale(&force,&dist_ik,-1.0*dfcg); // dri rik = - drk rik
@@ -645,9 +648,8 @@ int tersoff_mult_3bp_k2(t_moldyn *moldyn,
 #endif
 
        /* virial */
-       //v3_scale(&force,&force,-1.0);
-       if(aj<ai)
-               virial_calc(ai,&force,&dist_ik);
+       v3_scale(&force,&force,-1.0);
+       virial_calc(ai,&force,&dist_ik);
        
        /* increase k counter */
        exchange->kcount++;     
@@ -655,3 +657,30 @@ int tersoff_mult_3bp_k2(t_moldyn *moldyn,
        return 0;
 
 }
+
+int tersoff_mult_check_2b_bond(t_moldyn *moldyn,t_atom *ai,t_atom *aj,u8 bc) {
+
+       t_tersoff_mult_params *params;
+       t_3dvec dist;
+       double d;
+       u8 brand;
+
+       v3_sub(&dist,&(aj->r),&(ai->r));
+       if(bc) check_per_bound(moldyn,&dist);
+       d=v3_absolute_square(&dist);
+
+       params=moldyn->pot_params;
+       brand=ai->brand;
+
+       if(brand==aj->brand) {
+               if(d<=params->S2[brand])
+                       return TRUE;
+       }
+       else {
+               if(d<=params->S2mixed)
+                       return TRUE;
+       }
+
+       return FALSE;
+}
+