summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMagnus Lundborg <lundborg.magnus@gmail.com>2013-11-15 07:19:41 (GMT)
committerMagnus Lundborg <lundborg.magnus@gmail.com>2013-11-15 07:19:41 (GMT)
commit07172495620db5631ec537e09090273495304f77 (patch)
tree3fd146c22f0b4b2167495f22b377a70aeed25a33 /src
parent015f256ef3c5ceadf950244feb9be4fc8fc482ac (diff)
Compression precision can be set. Improved new frame set settings.
Two functions for getting and setting precision of lossy compression. Functions automatically creating new frame sets when needed now have better frame settings.
Diffstat (limited to 'src')
-rw-r--r--src/lib/tng_io.c109
1 files changed, 83 insertions, 26 deletions
diff --git a/src/lib/tng_io.c b/src/lib/tng_io.c
index c5aed0d..fe69ebd 100644
--- a/src/lib/tng_io.c
+++ b/src/lib/tng_io.c
@@ -366,6 +366,8 @@ struct tng_trajectory {
int *compress_algo_pos;
/** TNG compression algorithm for compressing velocities */
int *compress_algo_vel;
+ /** The precision used for lossy compression */
+ double compression_precision;
};
#ifndef USE_WINDOWS
@@ -3878,16 +3880,17 @@ static tng_function_status tng_compress(tng_trajectory_t tng_data,
{
dest = tng_compress_pos_float_find_algo(start_pos, (int)n_particles,
(int)algo_find_n_frames,
- (float)0.001, 0,
- tng_data->
+ (float)tng_data->compression_precision,
+ 0, tng_data->
compress_algo_pos,
&new_len);
if(algo_find_n_frames < n_frames)
{
dest = tng_compress_pos_float(start_pos, (int)n_particles,
- (int)n_frames, (float)0.001, 0,
- tng_data->compress_algo_pos,
+ (int)n_frames,
+ (float)tng_data->compression_precision,
+ 0, tng_data->compress_algo_pos,
&new_len);
}
}
@@ -3895,14 +3898,15 @@ static tng_function_status tng_compress(tng_trajectory_t tng_data,
{
dest = tng_compress_pos_find_algo(start_pos, (int)n_particles,
(int)algo_find_n_frames,
- 0.001, 0,
- tng_data->
+ tng_data->compression_precision,
+ 0, tng_data->
compress_algo_pos,
&new_len);
if(algo_find_n_frames < n_frames)
{
dest = tng_compress_pos(start_pos, (int)n_particles,
- (int)n_frames, 0.001, 0,
+ (int)n_frames,
+ tng_data->compression_precision, 0,
tng_data->compress_algo_pos,
&new_len);
}
@@ -3913,14 +3917,17 @@ static tng_function_status tng_compress(tng_trajectory_t tng_data,
if(type == TNG_FLOAT_DATA)
{
dest = tng_compress_pos_float(start_pos, (int)n_particles,
- (int)n_frames, (float)0.001, 0,
+ (int)n_frames,
+ (float)tng_data->compression_precision, 0,
tng_data->compress_algo_pos, &new_len);
}
else
{
dest = tng_compress_pos(start_pos, (int)n_particles,
- (int)n_frames, 0.001, 0,
- tng_data->compress_algo_pos, &new_len);
+ (int)n_frames,
+ tng_data->compression_precision, 0,
+ tng_data->compress_algo_pos,
+ &new_len);
}
}
}
@@ -3945,15 +3952,16 @@ static tng_function_status tng_compress(tng_trajectory_t tng_data,
{
dest = tng_compress_vel_float_find_algo(start_pos, (int)n_particles,
(int)algo_find_n_frames,
- (float)0.001, 0,
- tng_data->
+ (float)tng_data->compression_precision,
+ 0, tng_data->
compress_algo_vel,
&new_len);
if(algo_find_n_frames < n_frames)
{
dest = tng_compress_vel_float(start_pos, (int)n_particles,
- (int)n_frames, (float)0.001, 0,
- tng_data->compress_algo_vel,
+ (int)n_frames,
+ (float)tng_data->compression_precision,
+ 0, tng_data->compress_algo_vel,
&new_len);
}
}
@@ -3961,15 +3969,16 @@ static tng_function_status tng_compress(tng_trajectory_t tng_data,
{
dest = tng_compress_vel_find_algo(start_pos, (int)n_particles,
(int)algo_find_n_frames,
- 0.001, 0,
- tng_data->
+ tng_data->compression_precision,
+ 0, tng_data->
compress_algo_vel,
&new_len);
if(algo_find_n_frames < n_frames)
{
dest = tng_compress_vel(start_pos, (int)n_particles,
- (int)n_frames, 0.001, 0,
- tng_data->compress_algo_vel,
+ (int)n_frames,
+ tng_data->compression_precision,
+ 0, tng_data->compress_algo_vel,
&new_len);
}
}
@@ -3979,16 +3988,17 @@ static tng_function_status tng_compress(tng_trajectory_t tng_data,
if(type == TNG_FLOAT_DATA)
{
dest = tng_compress_vel_float(start_pos, (int)n_particles,
- (int)n_frames, (float)0.001, 0,
- tng_data->
+ (int)n_frames,
+ (float)tng_data->compression_precision,
+ 0, tng_data->
compress_algo_vel,
&new_len);
}
else
{
dest = tng_compress_vel(start_pos, (int)n_particles,
- (int)n_frames, 0.001, 0,
- tng_data->
+ (int)n_frames, tng_data->compression_precision,
+ 0, tng_data->
compress_algo_vel,
&new_len);
}
@@ -8254,6 +8264,7 @@ tng_function_status DECLSPECDLLEXPORT tng_trajectory_init(tng_trajectory_t *tng_
tng_data->compress_algo_pos = 0;
tng_data->compress_algo_vel = 0;
+ tng_data->compression_precision = 0.001;
tng_data->distance_unit_exponential = -9;
frame_set->first_frame = -1;
@@ -8799,6 +8810,7 @@ tng_function_status DECLSPECDLLEXPORT tng_trajectory_init_from_src(tng_trajector
dest->compress_algo_pos = 0;
dest->compress_algo_vel = 0;
dest->distance_unit_exponential = -9;
+ dest->compression_precision = 0.001;
frame_set->n_mapping_blocks = 0;
frame_set->mappings = 0;
@@ -9691,6 +9703,28 @@ tng_function_status DECLSPECDLLEXPORT tng_num_frames_get
return(TNG_SUCCESS);
}
+tng_function_status DECLSPECDLLEXPORT tng_compression_precision_get
+ (const tng_trajectory_t tng_data,
+ double *precision)
+{
+ TNG_ASSERT(tng_data, "TNG library: Trajectory container not properly setup.");
+
+ *precision = tng_data->compression_precision;
+
+ return(TNG_SUCCESS);
+}
+
+tng_function_status DECLSPECDLLEXPORT tng_compression_precision_set
+ (tng_trajectory_t tng_data,
+ const double precision)
+{
+ TNG_ASSERT(tng_data, "TNG library: Trajectory container not properly setup.");
+
+ tng_data->compression_precision = precision;
+
+ return(TNG_SUCCESS);
+}
+
tng_function_status DECLSPECDLLEXPORT tng_implicit_num_particles_set
(tng_trajectory_t tng_data,
const int64_t n)
@@ -11739,10 +11773,15 @@ tng_function_status DECLSPECDLLEXPORT tng_frame_data_write
/* If the wanted frame would be in the frame set after the last
* frame set create a new frame set. */
if(stat == TNG_FAILURE &&
- (last_frame < frame_nr &&
+ last_frame < frame_nr)
+/* (last_frame < frame_nr &&
tng_data->current_trajectory_frame_set.first_frame +
- tng_data->frame_set_n_frames >= frame_nr))
+ tng_data->frame_set_n_frames >= frame_nr))*/
{
+ if(last_frame + tng_data->frame_set_n_frames < frame_nr)
+ {
+ last_frame = frame_nr - 1;
+ }
tng_frame_set_new(tng_data,
last_frame+1,
tng_data->frame_set_n_frames);
@@ -12166,6 +12205,10 @@ tng_function_status DECLSPECDLLEXPORT tng_frame_particle_data_write
(last_frame < frame_nr &&
last_frame + tng_data->frame_set_n_frames >= frame_nr))
{
+ if(last_frame + tng_data->frame_set_n_frames < frame_nr)
+ {
+ last_frame = frame_nr - 1;
+ }
tng_frame_set_new(tng_data,
last_frame+1,
tng_data->frame_set_n_frames);
@@ -15242,6 +15285,7 @@ tng_function_status DECLSPECDLLEXPORT tng_util_generic_write
tng_particle_data_t p_data;
tng_non_particle_data_t np_data;
int64_t n_particles, n_frames, stride_length = 100, frame_pos;
+ int64_t last_frame;
char block_type_flag;
tng_function_status stat;
@@ -15287,7 +15331,9 @@ tng_function_status DECLSPECDLLEXPORT tng_util_generic_write
{
n_frames = frame_set->n_frames;
}
- if(frame_nr >= frame_set->first_frame + n_frames)
+ last_frame = frame_set->first_frame +
+ frame_set->n_frames - 1;
+ if(frame_nr > last_frame)
{
stat = tng_frame_set_write(tng_data, TNG_USE_HASH);
if(stat != TNG_SUCCESS)
@@ -15296,6 +15342,10 @@ tng_function_status DECLSPECDLLEXPORT tng_util_generic_write
__LINE__);
return(stat);
}
+ if(last_frame + tng_data->frame_set_n_frames < frame_nr)
+ {
+ last_frame = frame_nr - 1;
+ }
stat = tng_frame_set_new(tng_data, frame_set->first_frame +
frame_set->n_frames, n_frames);
if(stat != TNG_SUCCESS)
@@ -15432,6 +15482,7 @@ tng_function_status DECLSPECDLLEXPORT tng_util_generic_double_write
tng_particle_data_t p_data;
tng_non_particle_data_t np_data;
int64_t n_particles, n_frames, stride_length = 100, frame_pos;
+ int64_t last_frame;
char block_type_flag;
tng_function_status stat;
@@ -15477,7 +15528,9 @@ tng_function_status DECLSPECDLLEXPORT tng_util_generic_double_write
{
n_frames = frame_set->n_frames;
}
- if(frame_nr >= frame_set->first_frame + n_frames)
+ last_frame = frame_set->first_frame +
+ frame_set->n_frames - 1;
+ if(frame_nr > last_frame)
{
stat = tng_frame_set_write(tng_data, TNG_USE_HASH);
if(stat != TNG_SUCCESS)
@@ -15486,6 +15539,10 @@ tng_function_status DECLSPECDLLEXPORT tng_util_generic_double_write
__LINE__);
return(stat);
}
+ if(last_frame + tng_data->frame_set_n_frames < frame_nr)
+ {
+ last_frame = frame_nr - 1;
+ }
stat = tng_frame_set_new(tng_data, frame_set->first_frame +
frame_set->n_frames, n_frames);
if(stat != TNG_SUCCESS)
contact: Jan Huwald // Impressum