+/* harmonic oscillator potential and force */
+
+double potential_harmonic_oscillator(t_moldyn *moldyn) {
+
+ t_ho_params *params;
+ t_atom *atom;
+ int i,j;
+ int count;
+ t_3dvec distance;
+ double d,u;
+ double sc,equi_dist;
+
+ params=moldyn->pot_params;
+ atom=moldyn->atom;
+ sc=params->spring_constant;
+ equi_dist=params->equilibrium_distance;
+ count=moldyn->count;
+
+ u=0.0;
+ for(i=0;i<count;i++) {
+ for(j=0;j<i;j++) {
+ v3_sub(&distance,&(atom[i].r),&(atom[j].r));
+ d=v3_norm(&distance);
+ u+=(0.5*sc*(d-equi_dist)*(d-equi_dist));
+ }
+ }
+
+ return u;
+}
+
+int force_harmonic_oscillator(t_moldyn *moldyn) {
+
+ t_ho_params *params;
+ int i,j,count;
+ t_atom *atom;
+ t_3dvec distance;
+ t_3dvec force;
+ double d;
+ double sc,equi_dist;
+
+ atom=moldyn->atom;
+ count=moldyn->count;
+ params=moldyn->pot_params;
+ sc=params->spring_constant;
+ equi_dist=params->equilibrium_distance;
+
+ for(i=0;i<count;i++) v3_zero(&(atom[i].f));
+
+ for(i=0;i<count;i++) {
+ for(j=0;j<i;j++) {
+ v3_sub(&distance,&(atom[i].r),&(atom[j].r));
+ v3_per_bound(&distance,&(moldyn->dim));
+ d=v3_norm(&distance);
+ if(d<=moldyn->cutoff) {
+ v3_scale(&force,&distance,
+ (-sc*(1.0-(equi_dist/d))));
+ v3_add(&(atom[i].f),&(atom[i].f),&force);
+ v3_sub(&(atom[j].f),&(atom[j].f),&force);
+ }
+ }
+ }
+
+ return 0;
+}
+
+