diff --git a/examples/plot_sorted.py b/examples/plot_sorted.py index a5ec4637f102ea5f9ec55263d6b4d5e0aa6678d6..033e496864a328e26bf2289b819b79ae492f69be 100644 --- a/examples/plot_sorted.py +++ b/examples/plot_sorted.py @@ -69,6 +69,11 @@ axis = [ #names = ["side", "edge", "corner"] for orientation in range( 26 ): +# for jjj in range(2): +# if jjj == 0: +# orientation = 0 +# if jjj == 1: +# orientation = 8 # Read Quickshed accelerations data=loadtxt( "interaction_dump_%d.dat"%orientation ) @@ -114,6 +119,11 @@ for orientation in range( 26 ): subplot(311, title="Acceleration along X") #plot(id[abs(errx_s) > 0.001], e_errx_s , 'ro') plot(pos, e_errx_s , 'ro') + # for j in range(size(pos)): + # if ( pos[j-1] != pos[j] ): + # text(pos[j], e_errx_s[j]-0.005, "%d"%id[j], fontsize=10) + # else: + # text(pos[j], e_errx_s[j]-0.015, "%d"%id[j], fontsize=10) text( 0., 0.1, "axis=( %d %d %d )"%(axis[orientation*3 + 0], axis[orientation*3 + 1], axis[orientation*3 + 2]) , ha='center', backgroundcolor='w', fontsize=14) xlim(-1.2*max(abs(pos)), 1.2*max(abs(pos))) ylim(-0.05, 0.05) @@ -122,6 +132,11 @@ for orientation in range( 26 ): subplot(312, title="Acceleration along Y") #plot(id[abs(erry_s) > 0.001], e_erry_s , 'ro') plot(pos, e_erry_s , 'ro') + # for j in range(size(pos)): + # if ( pos[j-1] != pos[j] ): + # text(pos[j], e_errx_s[j]-0.005, "%d"%id[j], fontsize=10) + # else: + # text(pos[j], e_errx_s[j]-0.015, "%d"%id[j], fontsize=10) text( 0., 0.1, "axis=( %d %d %d )"%(axis[orientation*3 + 0], axis[orientation*3 + 1], axis[orientation*3 + 2]) , ha='center', backgroundcolor='w', fontsize=14) xlim(-1.2*max(abs(pos)), 1.2*max(abs(pos))) ylim(-0.05, 0.05) @@ -130,6 +145,11 @@ for orientation in range( 26 ): subplot(313, title="Acceleration along Z") #plot(id[abs(errz_s) > 0.001], e_errz_s , 'ro', label="Sorted") plot(pos, e_errz_s , 'ro', label="Sorted") + # for j in range(size(pos)): + # if ( pos[j-1] != pos[j] ): + # text(pos[j], e_errx_s[j]-0.005, "%d"%id[j], fontsize=10) + # else: + # text(pos[j], e_errx_s[j]-0.015, "%d"%id[j], fontsize=10) text( 0., 0.1, "axis=( %d %d %d )"%(axis[orientation*3 + 0], axis[orientation*3 + 1], axis[orientation*3 + 2]) , ha='center', backgroundcolor='w', fontsize=14) legend(loc="upper right") diff --git a/examples/test_bh_sorted.c b/examples/test_bh_sorted.c index cca9abcbddbcd6ceaffcfc98e742cb6f59edbfd1..4dbbe35513cfe8f7d9eb3874972a66186cbecc88 100644 --- a/examples/test_bh_sorted.c +++ b/examples/test_bh_sorted.c @@ -43,7 +43,6 @@ #define dist_min 0.5 /* Used for legacy walk only */ #define dist_cutoff_ratio 1.5 #define iact_pair_direct iact_pair_direct_sorted_multipole - #define ICHECK -1 #define NO_SANITY_CHECKS #define NO_COM_AS_TASK @@ -232,6 +231,8 @@ static inline void multipole_add_matrix(struct multipole *d, const float *x, flo for ( k = 0; k < 3; ++k) dx[k] = x[k] - d->x[k] / d->mass; + // message("x_i: %f %f %f dx: %f %f %f", x[0], x[1], x[2], dx[0], dx[1], dx[2]); + r2 = dx[0] * dx[0] + dx[1] * dx[1] + dx[2] * dx[2]; /* Now fill in the matrix */ @@ -282,23 +283,37 @@ static inline void multipole_iact(struct multipole *d, const float *x, float* a) /* Compute the acceleration from the monopole */ w = const_G * ir * ir * ir * d->mass; - for (k = 0; k < 3; k++) a[k] -= w * dx[k]; + float a_m[3] = {0., 0., 0.}; + for (k = 0; k < 3; k++) a_m[k] -= w * dx[k]; + //return; /* Compute the acceleration from the quadrupole */ - w = const_G * ir * ir * ir * ir * ir * ir * ir * 0.5f; - for (i=0 ; i<3 ; ++i) { - for (j=0 ; j<3 ; ++j) { - - a[0] += w * dx[i]*dx[j]*(2.*dx[j] - 5.*dx[0]) * d->Q[i][j]; - a[1] += w * dx[i]*dx[j]*(2.*dx[j] - 5.*dx[1]) * d->Q[i][j]; - a[2] += w * dx[i]*dx[j]*(2.*dx[j] - 5.*dx[2]) * d->Q[i][j]; - + float a_q[3] = {0., 0., 0.}; + float w1 = 0.5f * const_G * ir * ir * ir * ir * ir; + float w2 = -2.5f * const_G * ir * ir * ir * ir * ir * ir * ir; + float sum = 0.; + for (i = 0; i < 3; i++) { + for (j = 0; j < 3; j++) { + sum += dx[i] * d->Q[i][j] * dx[j]; } } + a_q[0] = w2 * sum * dx[0] + w1 * (2.*dx[0]*d->Q[0][0] + 2.*dx[1]*d->Q[0][1] + 2.*dx[2]*d->Q[0][2]); + a_q[1] = w2 * sum * dx[1] + w1 * (2.*dx[0]*d->Q[1][0] + 2.*dx[1]*d->Q[1][1] + 2.*dx[2]*d->Q[1][2]); + a_q[2] = w2 * sum * dx[2] + w1 * (2.*dx[0]*d->Q[2][0] + 2.*dx[1]*d->Q[2][1] + 2.*dx[2]*d->Q[2][2]); + float a_t[3] = {0., 0., 0.}; + for (k = 0; k < 3; k++) a_t[k] = a_m[k] + a_q[k]; + + /* message("x: %f %f %f ", x[0], x[1], x[2]); */ + /* message("d: %f %f %f ", dx[0], dx[1], dx[2]); */ + /* message("a_m: %f %f %f (%f)", a_m[0], a_m[1], a_m[2], sqrtf(a_m[0]*a_m[0] + a_m[1]*a_m[1] + a_m[2]*a_m[2])); */ + /* message("a_q: %f %f %f (%f)", a_q[0], a_q[1], a_q[2], sqrtf(a_q[0]*a_q[0] + a_q[1]*a_q[1] + a_q[2]*a_q[2])); */ + /* message("a_t: %f %f %f (%f)", a_t[0], a_t[1], a_t[2], sqrtf(a_t[0]*a_t[0] + a_t[1]*a_t[1] + a_t[2]*a_t[2])); */ + + for (k = 0; k < 3; k++) a[k] += a_t[k]; } @@ -365,36 +380,36 @@ const float axis_orth_second[13 * 3] = { 0.0, 7.071067811865475e-01, 7.071067811865475e-01, 0.0, 1.0, 0.0 }; -/* const int axis_num_orth[13] = { */ -/* /\* ( -1 , -1 , -1 ) *\/ 0, */ -/* /\* ( -1 , -1 , 0 ) *\/ 1, */ -/* /\* ( -1 , -1 , 1 ) *\/ 0, */ -/* /\* ( -1 , 0 , -1 ) *\/ 1, */ -/* /\* ( -1 , 0 , 0 ) *\/ 2, */ -/* /\* ( -1 , 0 , 1 ) *\/ 1, */ -/* /\* ( -1 , 1 , -1 ) *\/ 0, */ -/* /\* ( -1 , 1 , 0 ) *\/ 1, */ -/* /\* ( -1 , 1 , 1 ) *\/ 0, */ -/* /\* ( 0 , -1 , -1 ) *\/ 1, */ -/* /\* ( 0 , -1 , 0 ) *\/ 2, */ -/* /\* ( 0 , -1 , 1 ) *\/ 1, */ -/* /\* ( 0 , 0 , -1 ) *\/ 2 */ -/* }; */ const int axis_num_orth[13] = { - /* ( -1 , -1 , -1 ) */ 2, - /* ( -1 , -1 , 0 ) */ 2, - /* ( -1 , -1 , 1 ) */ 2, - /* ( -1 , 0 , -1 ) */ 2, - /* ( -1 , 0 , 0 ) */ 2, - /* ( -1 , 0 , 1 ) */ 2, - /* ( -1 , 1 , -1 ) */ 2, - /* ( -1 , 1 , 0 ) */ 2, - /* ( -1 , 1 , 1 ) */ 2, - /* ( 0 , -1 , -1 ) */ 2, - /* ( 0 , -1 , 0 ) */ 2, - /* ( 0 , -1 , 1 ) */ 2, - /* ( 0 , 0 , -1 ) */ 2 + /* ( -1 , -1 , -1 ) */ 0, + /* ( -1 , -1 , 0 ) */ 1, + /* ( -1 , -1 , 1 ) */ 0, + /* ( -1 , 0 , -1 ) */ 1, + /* ( -1 , 0 , 0 ) */ 2, + /* ( -1 , 0 , 1 ) */ 1, + /* ( -1 , 1 , -1 ) */ 0, + /* ( -1 , 1 , 0 ) */ 1, + /* ( -1 , 1 , 1 ) */ 0, + /* ( 0 , -1 , -1 ) */ 1, + /* ( 0 , -1 , 0 ) */ 2, + /* ( 0 , -1 , 1 ) */ 1, + /* ( 0 , 0 , -1 ) */ 2 }; +/* const int axis_num_orth[13] = { */ +/* /\* ( -1 , -1 , -1 ) *\/ 2, */ +/* /\* ( -1 , -1 , 0 ) *\/ 2, */ +/* /\* ( -1 , -1 , 1 ) *\/ 2, */ +/* /\* ( -1 , 0 , -1 ) *\/ 2, */ +/* /\* ( -1 , 0 , 0 ) *\/ 2, */ +/* /\* ( -1 , 0 , 1 ) *\/ 2, */ +/* /\* ( -1 , 1 , -1 ) *\/ 2, */ +/* /\* ( -1 , 1 , 0 ) *\/ 2, */ +/* /\* ( -1 , 1 , 1 ) *\/ 2, */ +/* /\* ( 0 , -1 , -1 ) *\/ 2, */ +/* /\* ( 0 , -1 , 0 ) *\/ 2, */ +/* /\* ( 0 , -1 , 1 ) *\/ 2, */ +/* /\* ( 0 , 0 , -1 ) *\/ 2 */ +/* }; */ const char axis_flip[27] = {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; @@ -1828,6 +1843,7 @@ static inline void iact_pair_direct_sorted_multipole(struct cell *ci, float x[3]; float a[3]; float mass, d; + int id; }; int i, j, k, l; @@ -1854,7 +1870,6 @@ static inline void iact_pair_direct_sorted_multipole(struct cell *ci, int num_orth_planes = 0; get_axis(&ci, &cj, &ind_i, &ind_j, axis, &num_orth_planes, orth1, orth2); for (k = 0; k < 3; k++) axis[k] = M_SQRT1_2 * (orth1[k] + orth2[k]); - //m_orth_planes = 0; for (k = 0; k < (1 << num_orth_planes); k++) multipole_init(&dip[k]); cjh = cj->h; @@ -1878,6 +1893,7 @@ static inline void iact_pair_direct_sorted_multipole(struct cell *ci, parts_i[i].x[k] = ci->parts[pid].x[k] - cj->loc[k]; parts_i[i].a[k] = 0.0f; } + parts_i[i].id = ci->parts[pid].id; parts_i[i].mass = ci->parts[pid].mass; } for (j = 0; j < count_j; j++) { @@ -1887,6 +1903,7 @@ static inline void iact_pair_direct_sorted_multipole(struct cell *ci, parts_j[j].x[k] = cj->parts[pjd].x[k] - cj->loc[k]; parts_j[j].a[k] = 0.0f; } + parts_j[j].id = cj->parts[pjd].id; parts_j[j].mass = cj->parts[pjd].mass; } @@ -2014,7 +2031,8 @@ static inline void iact_pair_direct_sorted_multipole(struct cell *ci, } for (l = 0; l < (1 << num_orth_planes); ++l) { - //multipole_print(&dip[l]); + /* message("Multipole for part %d:", parts_i[i].id); */ + /* multipole_print(&dip[l]); */ } /* Shrink count_j to the latest valid particle. */ @@ -2096,6 +2114,11 @@ static inline void iact_pair_direct_sorted_multipole(struct cell *ci, } + for (l = 0; l < (1 << num_orth_planes); ++l) { + /* message("Multipole for part %d:", parts_j[j].id); */ + /* multipole_print(&dip[l]); */ + } + /* Set the new last_i to the last particle checked. */ //last_i = i; @@ -2913,61 +2936,61 @@ void test_direct_neighbour(int N_parts, int orientation) { error("Failed to allocate particle buffer."); /* Create random set of particles in both cells */ - /* for (k = 0; k < 2 * N_parts; k++) { */ - /* parts[k].id = k; */ - - /* parts[k].x[0] = ((double)rand()) / RAND_MAX; */ - /* parts[k].x[1] = ((double)rand()) / RAND_MAX; */ - /* parts[k].x[2] = ((double)rand()) / RAND_MAX; */ - - /* /\* Shift the second cell *\/ */ - /* if (k >= N_parts) { */ - /* parts[k].x[0] += shift[0]; */ - /* parts[k].x[1] += shift[1]; */ - /* parts[k].x[2] += shift[2]; */ - /* } */ + for (k = 0; k < 2 * N_parts; k++) { + parts[k].id = k; - /* parts[k].mass = ((double)rand()) / RAND_MAX; */ - /* parts[k].a[0] = 0.0; */ - /* parts[k].a[1] = 0.0; */ - /* parts[k].a[2] = 0.0; */ - /* } */ - /* i=j; */ - /* j=i; */ - int id; - int size = 10; - float delta = 1. / (size); - float offset = delta * 0.5; - for (i = 0; i < size; ++i){ - for (j = 0; j < size; ++j){ - for (k = 0; k < size; ++k){ - id = i*size*size + j*size + k; - parts[id].id = id; - parts[id].x[0] = offset + delta * i + ((double)rand() / RAND_MAX) * delta * 0.01; - parts[id].x[1] = offset + delta * j + ((double)rand() / RAND_MAX) * delta * 0.01; - parts[id].x[2] = offset + delta * k + ((double)rand() / RAND_MAX) * delta * 0.01; - parts[id].mass = 1.; - parts[id].a[0] = 0.0; - parts[id].a[1] = 0.0; - parts[id].a[2] = 0.0; - } - } - } - for (i = 0; i < size; ++i){ - for (j = 0; j < size; ++j){ - for (k = 0; k < size; ++k){ - id = i*size*size + j*size + k + size*size*size; - parts[id].id = id; - parts[id].x[0] = offset + delta * i + shift[0] + ((double)rand() / RAND_MAX) * delta * 0.01; - parts[id].x[1] = offset + delta * j + shift[1] + ((double)rand() / RAND_MAX) * delta * 0.01; - parts[id].x[2] = offset + delta * k + shift[2] + ((double)rand() / RAND_MAX) * delta * 0.01; - parts[id].mass = 1.; - parts[id].a[0] = 0.0; - parts[id].a[1] = 0.0; - parts[id].a[2] = 0.0; - } + parts[k].x[0] = ((double)rand()) / RAND_MAX; + parts[k].x[1] = ((double)rand()) / RAND_MAX; + parts[k].x[2] = ((double)rand()) / RAND_MAX; + + /* Shift the second cell */ + if (k >= N_parts) { + parts[k].x[0] += shift[0]; + parts[k].x[1] += shift[1]; + parts[k].x[2] += shift[2]; } + + parts[k].mass = ((double)rand()) / RAND_MAX; + parts[k].a[0] = 0.0; + parts[k].a[1] = 0.0; + parts[k].a[2] = 0.0; } + i=j; + j=i; + /* int id; */ + /* int size = 2; */ + /* float delta = 1. / (size); */ + /* float offset = delta * 0.5; */ + /* for (i = 0; i < size; ++i){ */ + /* for (j = 0; j < size; ++j){ */ + /* for (k = 0; k < size; ++k){ */ + /* id = i*size*size + j*size + k; */ + /* parts[id].id = id; */ + /* parts[id].x[0] = offset + delta * i + ((double)rand() / RAND_MAX) * delta * 0.; */ + /* parts[id].x[1] = offset + delta * j + ((double)rand() / RAND_MAX) * delta * 0.; */ + /* parts[id].x[2] = offset + delta * k + ((double)rand() / RAND_MAX) * delta * 0.; */ + /* parts[id].mass = 1.; */ + /* parts[id].a[0] = 0.0; */ + /* parts[id].a[1] = 0.0; */ + /* parts[id].a[2] = 0.0; */ + /* } */ + /* } */ + /* } */ + /* for (i = 0; i < size; ++i){ */ + /* for (j = 0; j < size; ++j){ */ + /* for (k = 0; k < size; ++k){ */ + /* id = i*size*size + j*size + k + size*size*size; */ + /* parts[id].id = id; */ + /* parts[id].x[0] = offset + delta * i + shift[0] + ((double)rand() / RAND_MAX) * delta * 0.; */ + /* parts[id].x[1] = offset + delta * j + shift[1] + ((double)rand() / RAND_MAX) * delta * 0.; */ + /* parts[id].x[2] = offset + delta * k + shift[2] + ((double)rand() / RAND_MAX) * delta * 0.; */ + /* parts[id].mass = 1.; */ + /* parts[id].a[0] = 0.0; */ + /* parts[id].a[1] = 0.0; */ + /* parts[id].a[2] = 0.0; */ + /* } */ + /* } */ + /* } */ /* Get the cell geometry right */ left.loc[0] = 0.; @@ -3330,6 +3353,10 @@ int main(int argc, char *argv[]) { /* Run the test */ for (k = 0; k < 26; ++k) test_direct_neighbour(N_parts, k); + /* k++; */ + /* test_direct_neighbour(N_parts, 0); */ + /* test_direct_neighbour(N_parts, 8); */ + /* Dump arguments */ message("Interacting one cell with %d particles with its 27 neighbours"