11extern " C" {
2- __global__ void _harmonic_boltzmann_filter (
2+ __global__ void _harmonic_distance_filter (
33 const unsigned int N,
4- const double mu ,
5- const double sigma2 ,
4+ const double k_stretch ,
5+ const double rest_length ,
66 const double * rng,
77 const double * hdims,
88 const double * positions,
@@ -21,45 +21,45 @@ __global__ void _harmonic_boltzmann_filter(
2121 if ( (old_bond[i].x == -1 ) || (old_bond[i].y == -1 ) )
2222 return ;
2323
24- if ( (new_bond[i].x == -1 ) || (new_bond[i].y == -1 ) )
25- return ;
24+ if ( (new_bond[i].x == -1 ) || (new_bond[i].y == -1 ) )
25+ return ;
2626
2727 double3 * hdim = (double3 *) hdims;
2828 double3 * position = (double3 *) positions;
2929
3030 bool has_moved_left = (old_bond[i].x != new_bond[i].x );
3131 bool has_moved_right = (old_bond[i].y != new_bond[i].y );
32+
33+ auto harmonic_work = [=](unsigned int & i, unsigned int & j) {
34+
35+ double dx = position[j].x - position[i].x ;
36+ double dy = position[j].y - position[i].y ;
37+ double dz = position[j].z - position[i].z ;
38+
39+ dx -= (copysign (hdim->x , dx-hdim->x ) + copysign (hdim->x , dx+hdim->x ));
40+ dy -= (copysign (hdim->y , dy-hdim->y ) + copysign (hdim->y , dy+hdim->y ));
41+ dz -= (copysign (hdim->z , dz-hdim->z ) + copysign (hdim->z , dz+hdim->z ));
42+
43+ double step_size = sqrt (dx*dx + dy*dy + dz*dz);
44+ double harmonic_force = k_stretch * (step_size - rest_length);
45+
46+ return harmonic_force * step_size;
47+ };
3248
33- if ( has_moved_left || has_moved_right ) {
34- double delta_r2 = 0 .;
49+ if ( has_moved_left ) {
50+ unsigned int rtag1 = rtags[old_bond[i].x ];
51+ unsigned int rtag2 = rtags[new_bond[i].x ];
3552
36- for ( unsigned int j = 0 ; j < 2 ; ++j ) {
37- int2 tags = ((j==0 ) ? old_bond[i] : new_bond[i]);
53+ if ( rng[i] > exp (-harmonic_work (rtag1, rtag2)) )
54+ new_bond[i].x = old_bond[i].x ;
55+ }
3856
39- unsigned int rtag1 = rtags[tags.x ];
40- unsigned int rtag2 = rtags[tags.y ];
41-
42- double dx = position[rtag2].x - position[rtag1].x ;
43- double dy = position[rtag2].y - position[rtag1].y ;
44- double dz = position[rtag2].z - position[rtag1].z ;
45-
46- dx -= (copysign (hdim->x , dx-hdim->x ) + copysign (hdim->x , dx+hdim->x ));
47- dy -= (copysign (hdim->y , dy-hdim->y ) + copysign (hdim->y , dy+hdim->y ));
48- dz -= (copysign (hdim->z , dz-hdim->z ) + copysign (hdim->z , dz+hdim->z ));
49-
50- double delta_r = sqrt (dx*dx + dy*dy + dz*dz) - mu;
51- delta_r2 += ((j==0 ) ? delta_r*delta_r : -delta_r*delta_r);
52- }
57+ if ( has_moved_right ) {
58+ unsigned int rtag1 = rtags[old_bond[i].y ];
59+ unsigned int rtag2 = rtags[new_bond[i].y ];
5360
54- double boltzmann_weight = exp (delta_r2/sigma2);
55-
56- if ( rng[i] > boltzmann_weight ) {
57- if ( has_moved_left )
58- new_bond[i].x = old_bond[i].x ;
59-
60- if ( has_moved_right )
61- new_bond[i].y = old_bond[i].y ;
62- }
61+ if ( rng[i] > exp (-harmonic_work (rtag1, rtag2)) )
62+ new_bond[i].y = old_bond[i].y ;
6363 }
6464}
6565
0 commit comments