summaryrefslogtreecommitdiff
path: root/src/lib/tng_io.c
diff options
context:
space:
mode:
authorMagnus Lundborg <lundborg.magnus@gmail.com>2013-06-24 06:03:26 (GMT)
committerMagnus Lundborg <lundborg.magnus@gmail.com>2013-06-24 06:03:26 (GMT)
commit12659b7cac6809c55d71b5a29db5fdfb9674082b (patch)
tree8d6a6327f90538bc18997b15474208d1c2b8b5b8 /src/lib/tng_io.c
parent51e29fe0d826d720d4cd4c36e7c80b0a4f6cf626 (diff)
Added time_per_frame to frame set block.
The time step per frame is written in each frame set. If the time step per frame changes the current frame set is written to disk before changing the step size.
Diffstat (limited to 'src/lib/tng_io.c')
-rw-r--r--src/lib/tng_io.c119
1 files changed, 101 insertions, 18 deletions
diff --git a/src/lib/tng_io.c b/src/lib/tng_io.c
index 1f2a9a7..bec062a 100644
--- a/src/lib/tng_io.c
+++ b/src/lib/tng_io.c
@@ -171,8 +171,8 @@ struct tng_trajectory_frame_set {
int64_t long_stride_next_frame_set_file_pos;
/** The file position of the frame set one long stride step behind */
int64_t long_stride_prev_frame_set_file_pos;
- /** Time stamp in fs of first frame in frame set (since TNG_VERSION 3) */
- int64_t first_frame_time;
+ /** Time stamp (in seconds) of first frame in frame set */
+ double first_frame_time;
/* The data blocks in a frame set are trajectory data blocks */
/** The number of trajectory data blocks of particle dependent data */
@@ -311,6 +311,9 @@ struct tng_trajectory {
int64_t medium_stride_length;
/** The number of frame sets in a long stride step */
int64_t long_stride_length;
+ /** The current (can change from one frame set to another time length
+ * (in seconds) of one frame */
+ double time_per_frame;
/** The number of different kinds of molecules in the trajectory */
int64_t n_molecules;
@@ -3149,7 +3152,7 @@ static tng_function_status tng_frame_set_block_read
if(tng_data->input_endianness_swap_func_64)
{
if(tng_data->input_endianness_swap_func_64(tng_data,
- &frame_set->first_frame_time)
+ (int64_t *)&frame_set->first_frame_time)
!= TNG_SUCCESS)
{
printf("Cannot swap byte order. %s: %d\n",
@@ -3157,10 +3160,26 @@ static tng_function_status tng_frame_set_block_read
}
}
offset += sizeof(frame_set->first_frame_time);
+
+ memcpy(&tng_data->time_per_frame,
+ block->block_contents + offset,
+ sizeof(tng_data->time_per_frame));
+ if(tng_data->input_endianness_swap_func_64)
+ {
+ if(tng_data->input_endianness_swap_func_64(tng_data,
+ (int64_t *)&tng_data->time_per_frame)
+ != TNG_SUCCESS)
+ {
+ printf("Cannot swap byte order. %s: %d\n",
+ __FILE__, __LINE__);
+ }
+ }
+ offset += sizeof(tng_data->time_per_frame);
}
else
{
frame_set->first_frame_time = -1;
+ tng_data->time_per_frame = -1;
}
return(TNG_SUCCESS);
@@ -3207,7 +3226,9 @@ static tng_function_status tng_frame_set_block_write
strcpy(block->name, "TRAJECTORY FRAME SET");
block->id = TNG_TRAJECTORY_FRAME_SET;
- block->block_contents_size = sizeof(int64_t) * 9;
+ block->block_contents_size = sizeof(int64_t) * 8;
+ block->block_contents_size += sizeof(double) * 2;
+
if(tng_data->var_num_atoms_flag)
{
block->block_contents_size += sizeof(int64_t) * tng_data->n_molecules;
@@ -3378,6 +3399,21 @@ static tng_function_status tng_frame_set_block_write
}
offset += sizeof(frame_set->first_frame_time);
+ memcpy(block->block_contents+offset,
+ &tng_data->time_per_frame,
+ sizeof(tng_data->time_per_frame));
+ if(tng_data->output_endianness_swap_func_64)
+ {
+ if(tng_data->output_endianness_swap_func_64(tng_data,
+ (int64_t *)block->header_contents+offset)
+ != TNG_SUCCESS)
+ {
+ printf("Cannot swap byte order. %s: %d\n",
+ __FILE__, __LINE__);
+ }
+ }
+ offset += sizeof(tng_data->time_per_frame);
+
if(tng_block_header_write(tng_data, block, hash_mode) != TNG_SUCCESS)
{
printf("Cannot write header of file %s. %s: %d\n",
@@ -6288,8 +6324,8 @@ static tng_function_status tng_frame_set_pointers_update
contents_start_pos = ftell(tng_data->output_file);
- fseek(tng_data->output_file, block->block_contents_size - 7 *
- sizeof(int64_t), SEEK_CUR);
+ fseek(tng_data->output_file, block->block_contents_size - (6 *
+ sizeof(int64_t) + 2 * sizeof(double)), SEEK_CUR);
pos = tng_data->current_trajectory_frame_set_output_file_pos;
@@ -6339,8 +6375,8 @@ static tng_function_status tng_frame_set_pointers_update
contents_start_pos = ftell(tng_data->output_file);
- fseek(tng_data->output_file, block->block_contents_size - 5 *
- sizeof(int64_t), SEEK_CUR);
+ fseek(tng_data->output_file, block->block_contents_size - (4 *
+ sizeof(int64_t) + 2 * sizeof(double)), SEEK_CUR);
pos = tng_data->current_trajectory_frame_set_output_file_pos;
@@ -6389,8 +6425,8 @@ static tng_function_status tng_frame_set_pointers_update
contents_start_pos = ftell(tng_data->output_file);
- fseek(tng_data->output_file, block->block_contents_size - 3 *
- sizeof(int64_t), SEEK_CUR);
+ fseek(tng_data->output_file, block->block_contents_size - (2 *
+ sizeof(int64_t) + 2 * sizeof(double)), SEEK_CUR);
pos = tng_data->current_trajectory_frame_set_output_file_pos;
@@ -7736,6 +7772,8 @@ tng_function_status DECLSPECDLLEXPORT tng_trajectory_init(tng_trajectory_t *tng_
tng_data->medium_stride_length = 100;
tng_data->long_stride_length = 10000;
+ tng_data->time_per_frame = -1;
+
tng_data->n_particle_data_blocks = 0;
tng_data->n_data_blocks = 0;
@@ -8274,6 +8312,8 @@ tng_function_status DECLSPECDLLEXPORT tng_trajectory_init_from_src(tng_trajector
dest->medium_stride_length = src->medium_stride_length;
dest->long_stride_length = src->long_stride_length;
+ dest->time_per_frame = src->time_per_frame;
+
/* Currently the non trajectory data blocks are not copied since it
* can lead to problems when freeing memory in a parallel block. */
dest->n_particle_data_blocks = 0;
@@ -8975,8 +9015,8 @@ tng_function_status DECLSPECDLLEXPORT tng_medium_stride_length_set
}
tng_function_status DECLSPECDLLEXPORT tng_long_stride_length_get
- (const tng_trajectory_t tng_data,
- int64_t *len)
+ (const tng_trajectory_t tng_data,
+ int64_t *len)
{
*len = tng_data->long_stride_length;
@@ -8984,8 +9024,8 @@ tng_function_status DECLSPECDLLEXPORT tng_long_stride_length_get
}
tng_function_status DECLSPECDLLEXPORT tng_long_stride_length_set
- (tng_trajectory_t tng_data,
- const int64_t len)
+ (tng_trajectory_t tng_data,
+ const int64_t len)
{
if(len <= tng_data->medium_stride_length)
{
@@ -8996,6 +9036,35 @@ tng_function_status DECLSPECDLLEXPORT tng_long_stride_length_set
return(TNG_SUCCESS);
}
+tng_function_status DECLSPECDLLEXPORT tng_time_per_frame_get
+ (const tng_trajectory_t tng_data,
+ double *time)
+{
+ *time = tng_data->time_per_frame;
+
+ return(TNG_SUCCESS);
+}
+
+tng_function_status DECLSPECDLLEXPORT tng_time_per_frame_set
+ (tng_trajectory_t tng_data,
+ const double time)
+{
+ tng_trajectory_frame_set_t frame_set =
+ &tng_data->current_trajectory_frame_set;
+
+ /* If the current frame set is not finished write it to disk before
+ changing time per frame. */
+ if(frame_set->n_unwritten_frames > 0)
+ {
+ frame_set->n_frames = frame_set->n_unwritten_frames;
+ tng_frame_set_write(tng_data, TNG_USE_HASH);
+ }
+
+ tng_data->time_per_frame = time;
+
+ return(TNG_SUCCESS);
+}
+
tng_function_status DECLSPECDLLEXPORT tng_input_file_len_get
(const tng_trajectory_t tng_data,
int64_t *len)
@@ -10543,7 +10612,7 @@ tng_function_status DECLSPECDLLEXPORT tng_frame_set_with_time_new
(tng_trajectory_t tng_data,
const int64_t first_frame,
const int64_t n_frames,
- const int64_t first_frame_time)
+ const double first_frame_time)
{
tng_function_status stat;
@@ -10559,7 +10628,7 @@ tng_function_status DECLSPECDLLEXPORT tng_frame_set_with_time_new
tng_function_status DECLSPECDLLEXPORT tng_frame_set_first_frame_time_set
(tng_trajectory_t tng_data,
- const int64_t first_frame_time)
+ const double first_frame_time)
{
tng_data->current_trajectory_frame_set.first_frame_time = first_frame_time;
@@ -14347,6 +14416,20 @@ tng_function_status DECLSPECDLLEXPORT tng_long_stride_length_set_
return(tng_long_stride_length_set(tng_data, *len));
}
+tng_function_status DECLSPECDLLEXPORT tng_time_per_frame_get_
+ (const tng_trajectory_t tng_data,
+ double *time)
+{
+ return(tng_time_per_frame_get(tng_data, time));
+}
+
+tng_function_status DECLSPECDLLEXPORT tng_time_per_frame_set_
+ (tng_trajectory_t tng_data,
+ const double *time)
+{
+ return(tng_time_per_frame_set(tng_data, *time));
+}
+
tng_function_status DECLSPECDLLEXPORT tng_input_file_len_get_
(const tng_trajectory_t tng_data,
int64_t *len)
@@ -14744,7 +14827,7 @@ tng_function_status DECLSPECDLLEXPORT tng_frame_set_with_time_new_
(tng_trajectory_t tng_data,
const int64_t *first_frame,
const int64_t *n_frames,
- const int64_t *first_frame_time)
+ const double *first_frame_time)
{
return(tng_frame_set_new(tng_data, *first_frame, *n_frames,
*first_frame_time));
@@ -14752,7 +14835,7 @@ tng_function_status DECLSPECDLLEXPORT tng_frame_set_with_time_new_
tng_function_status DECLSPECDLLEXPORT tng_frame_set_first_frame_time_set_
(tng_trajectory_t tng_data,
- const int64_t *first_frame_time)
+ const double *first_frame_time)
{
return(tng_frame_set_first_frame_time_set(tng_data, *first_frame_time);
}
contact: Jan Huwald // Impressum