summaryrefslogtreecommitdiff
path: root/src/tests
diff options
context:
space:
mode:
Diffstat (limited to 'src/tests')
-rw-r--r--src/tests/tng_parallel_read.c85
1 files changed, 76 insertions, 9 deletions
diff --git a/src/tests/tng_parallel_read.c b/src/tests/tng_parallel_read.c
index 2aaa5f7..8078753 100644
--- a/src/tests/tng_parallel_read.c
+++ b/src/tests/tng_parallel_read.c
@@ -3,15 +3,24 @@
#include <tng_io.h>
#include <omp.h>
+
+/* N.B. this code is for testing parallel reading of trajectory frame sets. The
+ * performance is not improved very much and is to a large extent limited by
+ * disk i/o. It can however be used as inspiration for writing parallel code
+ * using the TNG library. */
+
int main(int argc, char **argv)
{
tng_trajectory_t traj, local_traj = 0;
- union data_values ***positions = 0; // A 3-dimensional array to be populated
+ union data_values ***local_positions = 0; // A 3-dimensional array to be populated
+ union data_values **particle_pos = 0;
int64_t n_particles, n_values_per_frame, n_frame_sets, n_frames;
+ int64_t n_frames_per_frame_set;
tng_data_type data_type;
- int i;
- int64_t particle = 0;
+ int i, j;
+ int64_t particle = 0, local_first_frame, local_last_frame;
char atom_name[64], res_name[64];
+ tng_trajectory_frame_set_t frame_set = 0;
if(argc <= 1)
{
@@ -30,6 +39,8 @@ int main(int argc, char **argv)
}
tng_input_file_set(traj, argv[1]);
+ tng_current_frame_set_get(traj, &frame_set);
+
// Read the file headers
tng_file_headers_read(traj, TNG_USE_HASH);
@@ -39,6 +50,15 @@ int main(int argc, char **argv)
}
tng_num_frame_sets_get(traj, &n_frame_sets);
+ tng_num_frames_per_frame_set_get(traj, &n_frames_per_frame_set);
+
+ particle_pos = malloc(sizeof(union data_values **) * n_frame_sets *
+ n_frames_per_frame_set);
+ for(i = n_frame_sets * n_frames_per_frame_set; i--;)
+ {
+ /* Assume 3 values per frame even if it's not determined yet */
+ particle_pos[i] = malloc(sizeof(union data_values) * 3);
+ }
printf("%"PRId64" frame sets\n", n_frame_sets);
@@ -58,10 +78,13 @@ int main(int argc, char **argv)
#pragma omp parallel \
private (n_frames, n_particles, n_values_per_frame, \
- data_type, positions) \
-firstprivate (local_traj)
+ local_first_frame, local_last_frame, j) \
+firstprivate (local_traj, local_positions, frame_set)\
+shared(data_type, traj, n_frame_sets, particle_pos, particle, i)\
+default(none)
{
- positions = 0;
+ /* Each tng_trajectory_t keeps its own file pointers and i/o positions.
+ * Therefore there must be a copy for each thread. */
tng_trajectory_copy(traj, &local_traj);
#pragma omp for
for(i = 0; i < n_frame_sets; i++)
@@ -70,22 +93,66 @@ firstprivate (local_traj)
{
printf("FAILED finding frame set %d!\n", i);
}
- if(tng_particle_data_get(local_traj, TNG_TRAJ_POSITIONS, &positions,
+ if(tng_particle_data_get(local_traj, TNG_TRAJ_POSITIONS, &local_positions,
&n_frames, &n_particles, &n_values_per_frame,
&data_type) != TNG_SUCCESS)
{
printf("FAILED getting particle data\n");
}
+ tng_current_frame_set_get(local_traj, &frame_set);
+ tng_frame_set_frame_range_get(local_traj, frame_set, &local_first_frame, &local_last_frame);
+// printf("Frame %"PRId64"-%"PRId64":\n", local_first_frame, local_last_frame);
// printf("%"PRId64" %"PRId64" %"PRId64"\n", n_frames, n_particles, n_values_per_frame);
+ for(j = 0; j < n_frames; j++)
+ {
+ particle_pos[local_first_frame + j][0] = local_positions[j][particle][0];
+ particle_pos[local_first_frame + j][1] = local_positions[j][particle][1];
+ particle_pos[local_first_frame + j][2] = local_positions[j][particle][2];
+ }
}
+
// Free memory
- if(positions)
+ if(local_positions)
{
- tng_particle_data_values_free(local_traj, positions, n_frames, n_particles,
+ tng_particle_data_values_free(local_traj, local_positions, n_frames, n_particles,
n_values_per_frame, data_type);
}
tng_trajectory_destroy(&local_traj);
}
+ switch(data_type)
+ {
+ case TNG_INT_DATA:
+ for(i = 0; i < n_frame_sets * n_frames_per_frame_set; i++)
+ {
+ printf("\t%"PRId64"\t%"PRId64"\t%"PRId64"\n", particle_pos[i][0].i,
+ particle_pos[i][1].i, particle_pos[i][2].i);
+ }
+ break;
+ case TNG_FLOAT_DATA:
+ for(i = 0; i < n_frame_sets * n_frames_per_frame_set; i++)
+ {
+ printf("\t%f\t%f\t%f\n", particle_pos[i][0].f,
+ particle_pos[i][1].f, particle_pos[i][2].f);
+ }
+ break;
+ case TNG_DOUBLE_DATA:
+ for(i = 0; i < n_frame_sets * n_frames_per_frame_set; i++)
+ {
+ printf("\t%f\t%f\t%f\n", particle_pos[i][0].d,
+ particle_pos[i][1].d, particle_pos[i][2].d);
+ }
+ break;
+ default:
+ break;
+ }
+
+ /* Free more memory */
+ for(i = n_frame_sets * n_frames_per_frame_set; i--;)
+ {
+ free(particle_pos[i]);
+ }
+ free(particle_pos);
+
tng_trajectory_destroy(&traj);
return(0);
contact: Jan Huwald // Impressum