diff options
Diffstat (limited to 'src/lib')
| -rw-r--r-- | src/lib/tng_io.c | 92 | 
1 files changed, 60 insertions, 32 deletions
| diff --git a/src/lib/tng_io.c b/src/lib/tng_io.c index 430fc35..2a8979e 100644 --- a/src/lib/tng_io.c +++ b/src/lib/tng_io.c @@ -4864,6 +4864,20 @@ static tng_function_status tng_particle_data_block_write      frame_step = (n_frames % stride_length) ? n_frames / stride_length + 1:                   n_frames / stride_length; +    /* TNG compression will use compression precision to get integers from +     * floating point data. The compression multiplier stores that information +     * to be able to return the precision of the compressed data. */ +    if(data->codec_id == TNG_TNG_COMPRESSION) +    { +        data->compression_multiplier = 1/tng_data->compression_precision; +    } +    /* Uncompressed data blocks do not use compression multipliers at all. +     * GZip compression does not need it either. */ +    else if(data->codec_id == TNG_UNCOMPRESSED || data->codec_id == TNG_GZIP_COMPRESSION) +    { +        data->compression_multiplier = 1.0; +    } +      if(mapping && mapping->n_particles != 0)      {          n_particles = mapping->n_particles; @@ -5107,7 +5121,8 @@ static tng_function_status tng_particle_data_block_write          switch(data->datatype)          {          case TNG_FLOAT_DATA: -            if(data->codec_id == TNG_UNCOMPRESSED) +            if(data->codec_id == TNG_UNCOMPRESSED || data-> codec_id == TNG_GZIP_COMPRESSION || +               data->codec_id == TNG_TNG_COMPRESSION)              {                  if(tng_data->input_endianness_swap_func_32)                  { @@ -5160,7 +5175,8 @@ static tng_function_status tng_particle_data_block_write              }              break;          case TNG_DOUBLE_DATA: -            if(data->codec_id == TNG_UNCOMPRESSED) +            if(data->codec_id == TNG_UNCOMPRESSED || data-> codec_id == TNG_GZIP_COMPRESSION || +               data->codec_id == TNG_TNG_COMPRESSION)              {                  if(tng_data->input_endianness_swap_func_64)                  { @@ -5762,6 +5778,20 @@ static tng_function_status tng_data_block_write(tng_trajectory_t tng_data,      frame_step = (n_frames % stride_length) ? n_frames / stride_length + 1:                   n_frames / stride_length; +    /* TNG compression will use compression precision to get integers from +     * floating point data. The compression multiplier stores that information +     * to be able to return the precision of the compressed data. */ +    if(data->codec_id == TNG_TNG_COMPRESSION) +    { +        data->compression_multiplier = 1/tng_data->compression_precision; +    } +    /* Uncompressed data blocks do not use compression multipliers at all. +     * GZip compression does not need it either. */ +    else if(data->codec_id == TNG_UNCOMPRESSED || data->codec_id == TNG_GZIP_COMPRESSION) +    { +        data->compression_multiplier = 1.0; +    } +      block->block_contents_size = sizeof(char) * 2 +                                   sizeof(data->n_values_per_frame) +                                   sizeof(data->codec_id); @@ -5945,7 +5975,8 @@ static tng_function_status tng_data_block_write(tng_trajectory_t tng_data,          switch(data->datatype)          {          case TNG_FLOAT_DATA: -            if(data->codec_id == TNG_UNCOMPRESSED) +            if(data->codec_id == TNG_UNCOMPRESSED || data-> codec_id == TNG_GZIP_COMPRESSION || +               data->codec_id == TNG_TNG_COMPRESSION)              {                  if(tng_data->input_endianness_swap_func_32)                  { @@ -5998,7 +6029,8 @@ static tng_function_status tng_data_block_write(tng_trajectory_t tng_data,              }              break;          case TNG_DOUBLE_DATA: -            if(data->codec_id == TNG_UNCOMPRESSED) +            if(data->codec_id == TNG_UNCOMPRESSED || data-> codec_id == TNG_GZIP_COMPRESSION || +               data->codec_id == TNG_TNG_COMPRESSION)              {                  if(tng_data->input_endianness_swap_func_64)                  { @@ -6066,14 +6098,6 @@ static tng_function_status tng_data_block_write(tng_trajectory_t tng_data,                      return(TNG_CRITICAL);                  }                  data->codec_id = TNG_UNCOMPRESSED; -                if(fabs(data->compression_multiplier - 1.0) > 0.00001) -                { -                    printf("TNG library: Multiplier applied, but block was not compressed. Data will be wrong.\n"); -                    printf("TNG library: The block might be completely corrupted.\n"); -                    /* FIXME: The data should be divided by the multiplier and the data that is only -                     * present in blocks containing compressed data (e.g. multiplier) must be -                     * removed */ -                }              }      /*         printf("TNG library: After compression: %"PRId64"\n", block->block_contents_size); */              break; @@ -7347,7 +7371,8 @@ tng_function_status DECLSPECDLLEXPORT tng_molecule_system_copy(tng_trajectory_t                                       &molecule_temp);          if(stat != TNG_SUCCESS)          { -            printf("TNG library: Cannot create new molecule to make a copy."); +            printf("TNG library: Cannot create new molecule to make a copy. %s: %d\n", +                   __FILE__, __LINE__);              return(stat);          }          molecule_temp->quaternary_str = molecule->quaternary_str; @@ -7359,7 +7384,8 @@ tng_function_status DECLSPECDLLEXPORT tng_molecule_system_copy(tng_trajectory_t                                                 &chain_temp);              if(stat != TNG_SUCCESS)              { -                printf("TNG library: Cannot create new chain to make a copy."); +                printf("TNG library: Cannot create new chain to make a copy. %s: %d\n", +                       __FILE__, __LINE__);                  return(stat);              }              for(k = 0; k < chain->n_residues; k++) @@ -7370,7 +7396,8 @@ tng_function_status DECLSPECDLLEXPORT tng_molecule_system_copy(tng_trajectory_t                                                    &residue_temp);                  if(stat != TNG_SUCCESS)                  { -                    printf("TNG library: Cannot create new residue to make a copy."); +                    printf("TNG library: Cannot create new residue to make a copy. %s: %d\n", +                           __FILE__, __LINE__);                      return(stat);                  }                  for(l = 0; l < residue->n_atoms; l++) @@ -7381,7 +7408,8 @@ tng_function_status DECLSPECDLLEXPORT tng_molecule_system_copy(tng_trajectory_t                                                       atom->id, &atom_temp);                      if(stat != TNG_SUCCESS)                      { -                        printf("TNG library: Cannot create new atom to make a copy."); +                    printf("TNG library: Cannot create new atom to make a copy. %s: %d\n", +                           __FILE__, __LINE__);                          return(stat);                      }                  } @@ -9283,7 +9311,7 @@ tng_function_status DECLSPECDLLEXPORT tng_output_append_file_set      tng_data->output_file_path = temp;      strncpy(tng_data->output_file_path, file_name, len); -     +      tng_data->output_file = fopen(tng_data->output_file_path, "r+");      if(!tng_data->output_file)      { @@ -11664,7 +11692,7 @@ tng_function_status tng_frame_set_write(tng_trajectory_t tng_data,      TNG_ASSERT(tng_data, "TNG library: Trajectory container not properly setup.");      frame_set = &tng_data->current_trajectory_frame_set; -     +      if(frame_set->n_written_frames == frame_set->n_frames)      {          return(TNG_SUCCESS); @@ -11754,15 +11782,15 @@ tng_function_status DECLSPECDLLEXPORT tng_frame_set_premature_write      tng_trajectory_frame_set_t frame_set;      TNG_ASSERT(tng_data, "TNG library: Trajectory container not properly setup."); -     +      frame_set = &tng_data->current_trajectory_frame_set; -     +      if(frame_set->n_unwritten_frames == 0)      {          return(TNG_SUCCESS);      }      frame_set->n_frames = frame_set->n_unwritten_frames; -     +      return(tng_frame_set_write(tng_data, hash_mode));  } @@ -11846,7 +11874,7 @@ tng_function_status DECLSPECDLLEXPORT tng_frame_set_new              if(tng_block_header_read(tng_data, block) != TNG_SUCCESS)              { -                printf("TNG library: Cannot read frame header. %s: %d\n", +                printf("TNG library: Cannot read frame set header. %s: %d\n",                      __FILE__, __LINE__);                  tng_data->input_file = temp;                  tng_block_destroy(&block); @@ -11902,7 +11930,7 @@ tng_function_status DECLSPECDLLEXPORT tng_frame_set_new                      if(tng_block_header_read(tng_data, block) != TNG_SUCCESS)                      { -                        printf("TNG library: Cannot read frame header. %s: %d\n", +                        printf("TNG library: Cannot read frame set header. %s: %d\n",                              __FILE__, __LINE__);                          tng_data->input_file = temp;                          tng_block_destroy(&block); @@ -12162,9 +12190,9 @@ tng_function_status DECLSPECDLLEXPORT tng_data_block_add              return(TNG_CRITICAL);          } -        if(n_frames > frame_set->n_written_frames) +        if(n_frames > frame_set->n_unwritten_frames)          { -            frame_set->n_written_frames = n_frames; +            frame_set->n_unwritten_frames = n_frames;          }          n_frames_div = (n_frames % stride_length) ? @@ -12311,9 +12339,9 @@ tng_function_status DECLSPECDLLEXPORT tng_particle_data_block_add              return(TNG_CRITICAL);          } -        if(n_frames > frame_set->n_written_frames) +        if(n_frames > frame_set->n_unwritten_frames)          { -            frame_set->n_written_frames = n_frames; +            frame_set->n_unwritten_frames = n_frames;          }          n_frames_div = (n_frames % stride_length) ? @@ -15185,7 +15213,7 @@ tng_function_status DECLSPECDLLEXPORT tng_util_trajectory_open  {      tng_function_status stat;      tng_gen_block_t block; -     +      TNG_ASSERT(filename, "TNG library: filename must not be a NULL pointer.");      if(mode != 'r' && mode != 'w' && mode != 'a') @@ -15216,7 +15244,7 @@ tng_function_status DECLSPECDLLEXPORT tng_util_trajectory_open          fseek((*tng_data_p)->input_file,                  (long)(*tng_data_p)->last_trajectory_frame_set_input_file_pos,                  SEEK_SET); -         +          tng_block_init(&block);          stat = tng_block_header_read(*tng_data_p, block); @@ -15235,7 +15263,7 @@ tng_function_status DECLSPECDLLEXPORT tng_util_trajectory_open                      __FILE__, __LINE__);              return(stat);          } -         +          (*tng_data_p)->first_trajectory_frame_set_output_file_pos =          (*tng_data_p)->first_trajectory_frame_set_input_file_pos;          (*tng_data_p)->last_trajectory_frame_set_output_file_pos = @@ -15255,7 +15283,7 @@ tng_function_status DECLSPECDLLEXPORT tng_util_trajectory_open              free((*tng_data_p)->input_file_path);              (*tng_data_p)->input_file_path = 0;          } -        tng_output_append_file_set(*tng_data_p, filename);         +        tng_output_append_file_set(*tng_data_p, filename);      }      return(TNG_SUCCESS); @@ -16468,7 +16496,7 @@ tng_function_status DECLSPECDLLEXPORT tng_util_generic_write          }          frame_set->n_unwritten_frames = frame_nr -                                          frame_set->first_frame + 1; -                                         +          n_frames = frame_set->n_frames;      } | 
