summaryrefslogtreecommitdiff
path: root/src/lib/trg_io.c
diff options
context:
space:
mode:
authorMagnus Lundborg <magnus.lundborg@scilifelab.se>2012-12-03 16:14:06 (GMT)
committerMagnus Lundborg <magnus.lundborg@scilifelab.se>2012-12-03 16:14:06 (GMT)
commit2742db93246135f910c74255dbd935bcf8438650 (patch)
treee056f4d609fab131f869675234a2135988791750 /src/lib/trg_io.c
parent8bb519b429a75ffd52526ba86fe89057e99f7840 (diff)
Changed name from trg to tng
Diffstat (limited to 'src/lib/trg_io.c')
-rw-r--r--src/lib/trg_io.c6934
1 files changed, 0 insertions, 6934 deletions
diff --git a/src/lib/trg_io.c b/src/lib/trg_io.c
deleted file mode 100644
index bc4424d..0000000
--- a/src/lib/trg_io.c
+++ /dev/null
@@ -1,6934 +0,0 @@
-/* This code is part of the trg binary trajectory format.
- *
- * VERSION 1.0
- *
- * Written by Magnus Lundborg
- * Copyright (c) 2012, The GROMACS development team.
- * check out http://www.gromacs.org for more information.
- *
- *
- * This program is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public License
- * as published by the Free Software Foundation; either version 2.1
- * of the License, or (at your option) any later version.
- */
-
-
-/* TODO: Make sure UTF-8 works properly */
-
-#include <inttypes.h>
-#include <limits.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "trg_io.h"
-#include "md5.h"
-
-#ifndef LOGIN_NAME_MAX
-#define LOGIN_NAME_MAX 33
-#endif
-#ifndef HOST_NAME_MAX
-#define HOST_NAME_MAX 257
-#endif
-
-
-/* This function swaps the byte order of a 32 bit numerical variable.
- It does not only work with integer, but e.g. floats need casting */
-static inline trg_function_status trg_swap_byte_order_32
- (const struct trg_trajectory *trg_data, int32_t *v)
-{
- switch(trg_data->endianness_32)
- {
- case TRG_LITTLE_ENDIAN_32: // Byte order is reversed.
- *v = (*v << 24) | // Move first byte to end
- ((*v & 0x00FF0000) >> 8) | // Move 2nd byte to pos 3
- ((*v & 0x0000FF00) << 8) | // Move 3rd byte to pos 2
- (*v >> 24); // Move last byte to first
-
- return(TRG_SUCCESS);
-
- case TRG_BYTE_PAIR_SWAP_32: // byte pair swap
- *v = ((*v & 0xFFFF0000) >> 16) |
- ((*v & 0x0000FFFF) << 16);
-
- return(TRG_SUCCESS);
-
- case TRG_BIG_ENDIAN_32: // Already correct
- return(TRG_SUCCESS);
-
- default:
- return(TRG_FAILURE);
- }
-}
-
-/* This function swaps the byte order of a 64 bit numerical variable.
- It does not only work with integer, but e.g. floats need casting
- The byte order swapping routine can convert five different byte
- orders to big endian. */
-static inline trg_function_status trg_swap_byte_order_64
- (const struct trg_trajectory *trg_data, int64_t *v)
-{
- switch(trg_data->endianness_64)
- {
- case TRG_LITTLE_ENDIAN_64: // Byte order is reversed.
- *v = (*v >> 56) | // Move first byte to end
- ((*v & 0x00FF000000000000) >> 40) | // Move 2nd byte to pos 7
- ((*v & 0x0000FF0000000000) >> 24) | // Move 3rd byte to pos 6
- ((*v & 0x000000FF00000000) >> 8 ) | // Move 4th byte to pos 5
- ((*v & 0x00000000FF000000) << 8 ) | // Move 5th byte to pos 4
- ((*v & 0x0000000000FF0000) << 24) | // Move 6th byte to pos 3
- ((*v & 0x000000000000FF00) << 40) | // Move 7th byte to pos 2
- (*v << 56); // Move last byte to first
-
- return(TRG_SUCCESS);
-
- case TRG_QUAD_SWAP_64: // Byte quad swap
- *v = ((*v & 0xFFFFFFFF00000000) >> 32) |
- ((*v & 0x00000000FFFFFFFF) << 32);
-
- return(TRG_SUCCESS);
-
- case TRG_BYTE_PAIR_SWAP_64: // Byte pair swap
- *v = ((*v & 0xFFFF0000FFFF0000) >> 16) |
- ((*v & 0x0000FFFF0000FFFF) << 16);
-
- return(TRG_SUCCESS);
-
- case TRG_BYTE_SWAP_64: // Byte swap
- *v = ((*v & 0xFF00FF00FF00FF00) >> 8) |
- ((*v & 0x00FF00FF00FF00FF) << 8);
-
- return(TRG_SUCCESS);
-
- case TRG_BIG_ENDIAN_64: // Already correct
- return(TRG_SUCCESS);
-
- default:
- return(TRG_FAILURE);
- }
-}
-
-/* Generate the md5 hash of a block.
- The hash is created based on the actual block contents. */
-static trg_function_status trg_generate_block_hash(struct trg_gen_block *block)
-{
- md5_state_t md5_state;
-
- md5_init(&md5_state);
- md5_append(&md5_state, (md5_byte_t *)block->block_contents,
- block->block_contents_size);
- md5_finish(&md5_state, (md5_byte_t *)block->hash);
-
- return(TRG_SUCCESS);
-}
-
-/* Compare the current block hash (e.g. read from file) with the hash
- calculated from the current contents.
- If the current hash is all zeros skip the comparison.
- If the hashes match results is set to TRUE, otherwise it is set to
- FALSE. */
-static trg_function_status trg_verify_hash_match(struct trg_gen_block *block,
- trg_bool *results)
-{
- md5_state_t md5_state;
- char hash[TRG_HASH_LEN];
-
- if(strcmp(block->hash,"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0") == 0)
- {
- *results = TRUE;
- return(TRG_SUCCESS);
- }
- md5_init(&md5_state);
- md5_append(&md5_state, (md5_byte_t *)block->block_contents,
- block->block_contents_size);
- md5_finish(&md5_state, (md5_byte_t *)hash);
-
- if(strncmp(block->hash, hash, 16) != 0)
- {
- *results = FALSE;
- }
- else
- {
- *results = TRUE;
- }
-
- return(TRG_SUCCESS);
-}
-
-
-static trg_function_status trg_init_input_file(struct trg_trajectory *trg_data,
- const trg_bool update_read_pos)
-{
- if(!trg_data->input_file)
- {
- if(!trg_data->input_file_path)
- {
- printf("No file specified for reading. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- trg_data->input_file = fopen(trg_data->input_file_path, "r");
- if(!trg_data->input_file)
- {
- printf("Cannot open file %s. %s: %d\n",
- trg_data->input_file_path, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- if(fseek(trg_data->input_file, trg_data->input_file_pos,
- SEEK_SET) != 0)
- {
- printf("Cannot specify position in file %s. %s: %d\n",
- trg_data->input_file_path, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
- else if(update_read_pos && fseek(trg_data->input_file,
- trg_data->input_file_pos, SEEK_SET) != 0)
- {
- printf("Cannot specify position in file %s. %s: %d\n",
- trg_data->input_file_path, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_init_output_file
- (struct trg_trajectory *trg_data,
- const trg_bool update_write_pos)
-{
- if(!trg_data->output_file)
- {
- if(!trg_data->output_file_path)
- {
- printf("No file specified for writing. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
-
- if(trg_data->output_file_pos <= 0)
- {
- trg_data->output_file = fopen(trg_data->output_file_path, "w+");
- }
- else
- {
- trg_data->output_file = fopen(trg_data->output_file_path, "a+");
- }
-
- if(!trg_data->output_file)
- {
- printf("Cannot open file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- if(fseek(trg_data->output_file, 0, SEEK_SET) != 0)
- {
- printf("Cannot specify position in file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
- else if(update_write_pos && fseek(trg_data->output_file, 0,
- SEEK_SET) != 0)
- {
- printf("Cannot specify position in file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_read_block_header
- (struct trg_trajectory *trg_data, struct trg_gen_block *block)
-{
- int len, offset = 0;
-
- if(trg_init_input_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- return(TRG_CRITICAL);
- }
-
- /* First read the header size to be able to read the whole header. */
- if(fread(&block->header_contents_size, sizeof(block->header_contents_size),
- 1, trg_data->input_file) == 0)
- {
- printf("Cannot read header size. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- &block->header_contents_size) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
-
- /* Move the reading position to the beginning of the header. */
- fseek(trg_data->input_file, -sizeof(block->header_contents_size),
- SEEK_CUR);
-
- /* If there is already memory allocated for the contents free it (we do not
- * know if the size is correct). */
- if(block->header_contents)
- {
- free(block->header_contents);
- }
-
- block->header_contents = (char *) malloc(block->header_contents_size);
- if(!block->header_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->header_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* Read the whole header into header_contents. This way it can be saved
- * even if it cannot be interpreted
- * for one reason or another. */
- if(fread(block->header_contents, block->header_contents_size, 1,
- trg_data->input_file) == 0)
- {
- printf("Cannot read header. %s: %d\n", __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* The header contents size has already been read. Skip ahead. */
- offset = sizeof(block->header_contents_size);
-
-
- /* Copy the respective parameters from the header contents block */
- memcpy(&block->block_contents_size, block->header_contents+offset,
- sizeof(block->block_contents_size));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &block->block_contents_size)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(block->block_contents_size);
-
- memcpy(&block->id, block->header_contents+offset, sizeof(block->id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &block->id) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(block->id);
-
- memcpy(block->hash, block->header_contents+offset, TRG_HASH_LEN);
- offset += TRG_HASH_LEN;
-
- if(block->name && strcmp(block->name, block->header_contents+offset) != 0)
- {
- free(block->name);
- block->name = 0;
- }
- len = min(strlen(block->header_contents+offset) + 1, TRG_MAX_STR_LEN);
- if(!block->name)
- {
- block->name = (char *) malloc(len);
- if(!block->name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- strncpy(block->name, block->header_contents+offset, len);
- }
- offset += len;
-
- memcpy(&block->block_version, block->header_contents+offset,
- sizeof(block->block_version));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &block->block_version)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(block->block_version);
-
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_write_block_header
- (struct trg_trajectory *trg_data,
- struct trg_gen_block *block, write_mode mode)
-{
- int name_len, offset = 0;
-
- if(trg_init_output_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- printf("Cannot initialise destination file. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
-
-
- /* Just dump the full header contents to file */
- if(mode == TRG_COPY_EXISTING)
- {
- if(!block->header_contents)
- {
- printf("No contents to write. %s: %d\n", __FILE__, __LINE__);
- return(TRG_FAILURE);
- }
- if(fwrite(block->header_contents, block->header_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all header data. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- return(TRG_SUCCESS);
- }
-
- if(!block->name)
- {
- block->name = (char *) malloc(1);
- if(!block->name)
- {
- printf("Cannot allocate memory (1 byte). %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- block->name[0] = 0;
- }
-
- name_len = min(strlen(block->name) + 1, TRG_MAX_STR_LEN);
-
- trg_generate_block_hash(block);
-
- /* Calculate the size of the header to write */
- block->header_contents_size = sizeof(block->header_contents_size) +
- sizeof(block->block_contents_size) +
- sizeof(block->id) +
- sizeof(block->block_version) +
- TRG_HASH_LEN +
- name_len;
-
- if(block->header_contents)
- {
- free(block->header_contents);
- }
-
- block->header_contents = (char *) malloc(block->header_contents_size);
- if(!block->header_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->header_contents_size, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
-
- /* First copy all data into the header_contents block and finally write
- * the whole block at once. */
- memcpy(block->header_contents, &block->header_contents_size,
- sizeof(block->header_contents_size));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->header_contents))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(block->header_contents_size);
-
- memcpy(block->header_contents+offset, &block->block_contents_size,
- sizeof(block->block_contents_size));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->header_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(block->block_contents_size);
-
- memcpy(block->header_contents+offset, &block->id, sizeof(block->id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->header_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(block->id);
-
- memcpy(block->header_contents+offset, block->hash, TRG_HASH_LEN);
- offset += TRG_HASH_LEN;
-
- strncpy(block->header_contents+offset, block->name, name_len);
- offset += name_len;
-
- memcpy(block->header_contents+offset, &block->block_version,
- sizeof(block->block_version));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->header_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(block->block_version);
-
- if(fwrite(block->header_contents, block->header_contents_size,
- 1, trg_data->output_file) != 1)
- {
- printf("Could not write all header data. %s: %d\n", __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- return(TRG_SUCCESS);
-}
-
-
-static trg_function_status trg_read_general_info_block
- (struct trg_trajectory *trg_data, struct trg_gen_block *block)
-{
- int len, offset = 0;
- trg_bool same_hash;
-
- if(trg_init_input_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- return(TRG_CRITICAL);
- }
-
- block->block_contents = (char *) malloc(block->block_contents_size);
- if(!block->block_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->block_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* Read the whole block into block_contents to be able to write it to disk
- * even if it cannot be interpreted. */
- if(fread(block->block_contents, block->block_contents_size, 1,
- trg_data->input_file) == 0)
- {
- printf("Cannot read block. %s: %d\n", __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* FIXME: Does not check if the size of the contents matches the expected
- * size or if the contents can be read. */
-
-
- if(trg_verify_hash_match(block, &same_hash) != TRG_SUCCESS)
- {
- printf("Error comparing hashes. %s: %d\n", __FILE__, __LINE__);
- return(TRG_FAILURE);
- }
- if(same_hash != TRUE)
- {
- printf("General info block contents corrupt. Hashes do not match. "
- "%s: %d\n",
- __FILE__, __LINE__);
-// return(TRG_FAILURE);
- }
-
- len = min(strlen(block->block_contents) + 1, TRG_MAX_STR_LEN);
- trg_data->program_name = (char *) malloc(len);
- if(!trg_data->program_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- strncpy(trg_data->program_name, block->block_contents, len);
- offset += len;
-
- len = min(strlen(block->block_contents+offset) + 1, TRG_MAX_STR_LEN);
- trg_data->forcefield_name = (char *) malloc(len);
- if(!trg_data->forcefield_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- strncpy(trg_data->forcefield_name, block->block_contents+offset, len);
- offset += len;
-
- len = min(strlen(block->block_contents+offset) + 1, TRG_MAX_STR_LEN);
- trg_data->user_name = (char *) malloc(len);
- if(!trg_data->user_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- strncpy(trg_data->user_name, block->block_contents+offset, len);
- offset += len;
-
- memcpy(&trg_data->time, block->block_contents+offset,
- sizeof(trg_data->time));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &trg_data->time) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(trg_data->time);
-
- len = min(strlen(block->block_contents+offset) + 1, TRG_MAX_STR_LEN);
- trg_data->computer_name = (char *) malloc(len);
- if(!trg_data->computer_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- strncpy(trg_data->computer_name, block->block_contents+offset, len);
- offset += len;
-
- len = min(strlen(block->block_contents+offset) + 1, TRG_MAX_STR_LEN);
- trg_data->pgp_signature = (char *) malloc(len);
- if(!trg_data->pgp_signature)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- strncpy(trg_data->pgp_signature, block->block_contents+offset, len);
- offset += len;
-
- memcpy(&trg_data->var_num_atoms_flag, block->block_contents+offset,
- sizeof(trg_data->var_num_atoms_flag));
- offset += sizeof(trg_data->var_num_atoms_flag);
-
- memcpy(&trg_data->frame_set_n_frames, block->block_contents+offset,
- sizeof(trg_data->frame_set_n_frames));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &trg_data->frame_set_n_frames)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(trg_data->frame_set_n_frames);
-
- memcpy(&trg_data->first_trajectory_frame_set_input_file_pos,
- block->block_contents+offset,
- sizeof(trg_data->first_trajectory_frame_set_input_file_pos));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- &trg_data->first_trajectory_frame_set_input_file_pos)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(trg_data->first_trajectory_frame_set_input_file_pos);
- trg_data->current_trajectory_frame_set.next_frame_set_file_pos =
- trg_data->first_trajectory_frame_set_input_file_pos;
-
-
- memcpy(&trg_data->last_trajectory_frame_set_input_file_pos,
- block->block_contents+offset,
- sizeof(trg_data->last_trajectory_frame_set_input_file_pos));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- &trg_data->last_trajectory_frame_set_input_file_pos)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(trg_data->last_trajectory_frame_set_input_file_pos);
-
- memcpy(&trg_data->stride_length, block->block_contents+offset,
- sizeof(trg_data->stride_length));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &trg_data->stride_length)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
-
-
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_write_general_info_block
- (struct trg_trajectory *trg_data,
- struct trg_gen_block *block,
- write_mode mode)
-{
- int program_name_len, forcefield_name_len, user_name_len;
- int computer_name_len, pgp_signature_len;
- int offset = 0;
-
- if(trg_init_output_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- return(TRG_CRITICAL);
- }
-
- if(!trg_data->program_name)
- {
- trg_data->program_name = (char *) malloc(1);
- if(!trg_data->program_name)
- {
- printf("Cannot allocate memory (1 byte). %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- trg_data->program_name[0] = 0;
- }
- if(!trg_data->forcefield_name)
- {
- trg_data->forcefield_name = (char *) malloc(1);
- if(!trg_data->forcefield_name)
- {
- printf("Cannot allocate memory (1 byte). %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- trg_data->forcefield_name[0] = 0;
- }
- if(!trg_data->user_name)
- {
- trg_data->user_name = (char *) malloc(1);
- if(!trg_data->user_name)
- {
- printf("Cannot allocate memory (1 byte). %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- trg_data->user_name[0] = 0;
- }
- if(!trg_data->computer_name)
- {
- trg_data->computer_name = (char *) malloc(1);
- if(!trg_data->computer_name)
- {
- printf("Cannot allocate memory (1 byte). %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- trg_data->computer_name[0] = 0;
- }
- if(!trg_data->pgp_signature)
- {
- trg_data->pgp_signature = (char *) malloc(1);
- if(!trg_data->pgp_signature)
- {
- printf("Cannot allocate memory (1 byte). %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- trg_data->pgp_signature[0] = 0;
- }
-
- program_name_len = min(strlen(trg_data->program_name) + 1,
- TRG_MAX_STR_LEN);
- forcefield_name_len = min(strlen(trg_data->forcefield_name) + 1,
- TRG_MAX_STR_LEN);
- user_name_len = min(strlen(trg_data->user_name) + 1,
- TRG_MAX_STR_LEN);
- computer_name_len = min(strlen(trg_data->computer_name) + 1,
- TRG_MAX_STR_LEN);
- pgp_signature_len = min(strlen(trg_data->pgp_signature) + 1,
- TRG_MAX_STR_LEN);
-
- /* If just dumping the whole block_contents it is not certain that the
- * contents are known beforehand (e.g. due to different file versions) */
- if(mode == TRG_COPY_EXISTING)
- {
- if(trg_write_block_header(trg_data, block, mode) != TRG_SUCCESS)
- {
- printf("Cannot write header of file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(!block->block_contents)
- {
- printf("No block data to write. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_FAILURE);
- }
- if(fwrite(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all block data. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- return(TRG_SUCCESS);
- }
-
- block->block_contents_size = sizeof(trg_data->time) +
- sizeof(trg_data->var_num_atoms_flag) +
- sizeof(trg_data->frame_set_n_frames) +
- sizeof(trg_data->first_trajectory_frame_set_input_file_pos) +
- sizeof(trg_data->last_trajectory_frame_set_input_file_pos) +
- sizeof(trg_data->stride_length) +
- program_name_len +
- forcefield_name_len +
- user_name_len +
- computer_name_len +
- pgp_signature_len;
-
- if(block->block_contents)
- {
- free(block->block_contents);
- }
- block->block_contents = (char *) malloc(block->block_contents_size);
- if(!block->block_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->block_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- strncpy(block->block_contents, trg_data->program_name, program_name_len);
- offset += program_name_len;
-
- strncpy(block->block_contents+offset, trg_data->forcefield_name,
- forcefield_name_len);
- offset += forcefield_name_len;
-
- strncpy(block->block_contents+offset, trg_data->user_name, user_name_len);
- offset += user_name_len;
-
- memcpy(block->block_contents+offset, &trg_data->time,
- sizeof(trg_data->time));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(trg_data->time);
-
- strncpy(block->block_contents+offset, trg_data->computer_name,
- computer_name_len);
- offset += computer_name_len;
-
- strncpy(block->block_contents+offset, trg_data->pgp_signature,
- pgp_signature_len);
- offset += pgp_signature_len;
-
- memcpy(block->block_contents+offset, &trg_data->var_num_atoms_flag,
- sizeof(trg_data->var_num_atoms_flag));
- offset += sizeof(trg_data->var_num_atoms_flag);
-
- memcpy(block->block_contents+offset, &trg_data->frame_set_n_frames,
- sizeof(trg_data->frame_set_n_frames));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(trg_data->frame_set_n_frames);
-
- memcpy(block->block_contents+offset,
- &trg_data->first_trajectory_frame_set_input_file_pos,
- sizeof(trg_data->first_trajectory_frame_set_input_file_pos));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(trg_data->first_trajectory_frame_set_input_file_pos);
-
- memcpy(block->block_contents+offset,
- &trg_data->last_trajectory_frame_set_input_file_pos,
- sizeof(trg_data->last_trajectory_frame_set_input_file_pos));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(trg_data->last_trajectory_frame_set_input_file_pos);
-
-
- memcpy(block->block_contents+offset, &trg_data->stride_length,
- sizeof(trg_data->stride_length));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
-
-
- if(trg_write_block_header(trg_data, block, mode) != TRG_SUCCESS)
- {
- printf("Cannot write header of file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(fwrite(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all block data. %s: %d\n", __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- return(TRG_SUCCESS);
-}
-
-/* FIXME: Update this according to the new specs */
-static trg_function_status trg_read_molecules_block
- (struct trg_trajectory *trg_data,
- struct trg_gen_block *block)
-{
- int i, j, k, l, len, offset = 0;
- struct trg_molecule *molecule;
- struct trg_chain *chain;
- struct trg_residue *residue;
- struct trg_atom *atom;
- struct trg_bond *bond;
- trg_bool same_hash;
-
- if(trg_init_input_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(block->block_contents)
- {
- free(block->block_contents);
- }
-
- block->block_contents = (char *) malloc(block->block_contents_size);
- if(!block->block_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->block_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* Read the whole block into block_contents to be able to write it to disk
- * even if it cannot be interpreted. */
- if(fread(block->block_contents, block->block_contents_size, 1,
- trg_data->input_file) == 0)
- {
- printf("Cannot read block. %s: %d\n", __FILE__, __LINE__);
- }
-
- /* FIXME: Does not check if the size of the contents matches the expected
- * size or if the contents can be read. */
-
- if(trg_verify_hash_match(block, &same_hash) != TRG_SUCCESS)
- {
- printf("Error comparing hashes. %s: %d\n", __FILE__, __LINE__);
- return(TRG_FAILURE);
- }
- if(same_hash != TRUE)
- {
- printf("Molecules block contents corrupt. Hashes do not match. "
- "%s: %d\n",
- __FILE__, __LINE__);
-// return(TRG_FAILURE);
- }
-
- memcpy(&trg_data->n_molecules, block->block_contents,
- sizeof(trg_data->n_molecules));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &trg_data->n_molecules)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(trg_data->n_molecules);
-
- if(trg_data->molecules)
- {
- free(trg_data->molecules);
- }
-
- trg_data->n_particles = 0;
-
- trg_data->molecules = (struct trg_molecule *)
- malloc(trg_data->n_molecules *
- sizeof(struct trg_molecule));
- if(!trg_data->molecules)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- trg_data->n_molecules * sizeof(struct trg_molecule),
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(!trg_data->var_num_atoms_flag)
- {
- if(trg_data->molecule_cnt_list)
- {
- free(trg_data->molecule_cnt_list);
- }
- trg_data->molecule_cnt_list = (int64_t *) malloc(sizeof(int64_t) *
- trg_data->n_molecules);
- if(!trg_data->molecule_cnt_list)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- trg_data->n_molecules * sizeof(struct trg_molecule),
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- }
-
-
- for(i=0; i < trg_data->n_molecules; i++)
- {
- molecule = &trg_data->molecules[i];
-
- memcpy(&molecule->id, block->block_contents+offset,
- sizeof(molecule->id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &molecule->id) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(molecule->id);
-
-// printf("Read id: %"PRId64" offset: %d\n", molecule->id, offset);
- len = min(strlen(block->block_contents+offset) + 1, TRG_MAX_STR_LEN);
- molecule->name = (char *) malloc(len);
- strncpy(molecule->name, block->block_contents+offset, len);
- offset += len;
-
- memcpy(&molecule->quaternary_str, block->block_contents+offset,
- sizeof(molecule->quaternary_str));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &molecule->quaternary_str) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(molecule->quaternary_str);
-
- if(!trg_data->var_num_atoms_flag)
- {
- memcpy(&trg_data->molecule_cnt_list[i],
- block->block_contents+offset,
- sizeof(int64_t));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- &trg_data->molecule_cnt_list[i]) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(int64_t);
- }
-
-
- memcpy(&molecule->n_chains, block->block_contents+offset,
- sizeof(molecule->n_chains));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &molecule->n_chains)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(molecule->n_chains);
-
- memcpy(&molecule->n_residues, block->block_contents+offset,
- sizeof(molecule->n_residues));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &molecule->n_residues)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(molecule->n_residues);
-
- memcpy(&molecule->n_atoms, block->block_contents+offset,
- sizeof(molecule->n_atoms));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &molecule->n_atoms)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(molecule->n_atoms);
-
- trg_data->n_particles += molecule->n_atoms *
- trg_data->molecule_cnt_list[i];
-
- molecule->chains = (struct trg_chain *) malloc(molecule->n_chains *
- sizeof(struct trg_chain));
- if(!molecule->chains)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- molecule->n_chains * sizeof(struct trg_chain),
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- chain = molecule->chains;
-
- molecule->residues = (struct trg_residue *)
- malloc(molecule->n_residues *
- sizeof(struct trg_residue));
- if(!molecule->residues)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- molecule->n_residues * sizeof(struct trg_residue),
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- residue = molecule->residues;
-
- molecule->atoms = (struct trg_atom *) malloc(molecule->n_atoms *
- sizeof(struct trg_atom));
- if(!molecule->atoms)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- molecule->n_atoms * sizeof(struct trg_atom),
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- atom = molecule->atoms;
-
- for(j=molecule->n_chains; j--;)
- {
- chain->molecule = molecule;
-
- memcpy(&chain->id, block->block_contents+offset,
- sizeof(chain->id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &chain->id) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(chain->id);
-
- len = min(strlen(block->block_contents+offset) + 1,
- TRG_MAX_STR_LEN);
- chain->name = (char *) malloc(len);
- strncpy(chain->name,
- block->block_contents+offset, len);
- offset += len;
-
- memcpy(&chain->n_residues, block->block_contents+offset,
- sizeof(chain->n_residues));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &chain->n_residues)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(chain->n_residues);
-
- chain->residues = residue;
- for(k=chain->n_residues; k--;)
- {
- residue->chain = chain;
- memcpy(&residue->id, block->block_contents+offset,
- sizeof(residue->id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &residue->id) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(residue->id);
-
- len = min(strlen(block->block_contents+offset) + 1,
- TRG_MAX_STR_LEN);
- residue->name = (char *) malloc(len);
- strncpy(residue->name,
- block->block_contents+offset, len);
- offset += len;
-
- memcpy(&residue->n_atoms, block->block_contents+offset,
- sizeof(residue->n_atoms));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &residue->n_atoms)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(residue->n_atoms);
-
- residue->atoms = atom;
- for(l=residue->n_atoms; l--;)
- {
- atom->residue = residue;
-
- memcpy(&atom->id, block->block_contents+offset,
- sizeof(atom->id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &atom->id) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(atom->id);
-
- len = min(strlen(block->block_contents+offset) + 1,
- TRG_MAX_STR_LEN);
- atom->name = (char *) malloc(len);
- strncpy(atom->name,
- block->block_contents+offset, len);
- offset += len;
-
- len = min(strlen(block->block_contents+offset) + 1,
- TRG_MAX_STR_LEN);
- atom->atom_type = (char *) malloc(len);
- strncpy(atom->atom_type,
- block->block_contents+offset, len);
- offset += len;
-
- atom++;
- }
- residue++;
- }
- chain++;
- }
-
- memcpy(&molecule->n_bonds, block->block_contents+offset,
- sizeof(molecule->n_bonds));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &molecule->n_bonds)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(molecule->n_bonds);
-
- molecule->bonds = (struct trg_bond *) malloc(molecule->n_bonds *
- sizeof(struct trg_bond));
- if(!molecule->bonds)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- molecule->n_bonds * sizeof(struct trg_bond),
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- bond = molecule->bonds;
-
- for(j=molecule->n_bonds; j--;)
- {
- memcpy(&bond->from_atom_id, block->block_contents+offset,
- sizeof(bond->from_atom_id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &bond->from_atom_id)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(bond->from_atom_id);
-
- memcpy(&bond->to_atom_id, block->block_contents+offset,
- sizeof(bond->to_atom_id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &bond->to_atom_id)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(bond->to_atom_id);
-
- bond++;
- }
- }
-
- return(TRG_SUCCESS);
-}
-
-/* FIXME: Update this according to the new specs */
-static trg_function_status trg_write_molecules_block
- (struct trg_trajectory *trg_data,
- struct trg_gen_block *block,
- write_mode mode)
-{
- int len = 0;
- int i, j, k, l, offset = 0;
- struct trg_molecule *molecule;
- struct trg_chain *chain;
- struct trg_residue *residue;
- struct trg_atom *atom;
- struct trg_bond *bond;
-
- if(trg_init_output_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(mode != TRG_COPY_EXISTING && !trg_data->molecules)
- {
- return(TRG_SUCCESS);
- }
-
-// printf("Predicting block size\n");
- /* First predict the size of the block */
- for(i = 0; i < trg_data->n_molecules; i++)
- {
- molecule = &trg_data->molecules[i];
-// printf("mol %s\n", molecule->name);
- if(!molecule->name)
- {
- molecule->name = (char *) malloc(1);
- if(!molecule->name)
- {
- printf("Cannot allocate memory (1 byte). %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- molecule->name[0] = 0;
- }
- len += min(strlen(molecule->name) + 1, TRG_MAX_STR_LEN);
-
- chain = molecule->chains;
- for(j = molecule->n_chains; j--;)
- {
- len += sizeof(chain->id);
-
- if(!chain->name)
- {
- chain->name = (char *) malloc(1);
- if(!chain->name)
- {
- printf("Cannot allocate memory (1 byte). %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- chain->name[0] = 0;
- }
- len += min(strlen(chain->name) + 1, TRG_MAX_STR_LEN);
-
- len += sizeof(chain->n_residues);
-
- chain++;
- }
-
- residue = molecule->residues;
- for(j = molecule->n_residues; j--;)
- {
- len += sizeof(residue->id);
-
- if(!residue->name)
- {
- residue->name = (char *) malloc(1);
- if(!residue->name)
- {
- printf("Cannot allocate memory (1 byte). %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- residue->name[0] = 0;
- }
- len += min(strlen(residue->name) + 1, TRG_MAX_STR_LEN);
-
- len += sizeof(residue->n_atoms);
-
- residue++;
- }
-
- atom = molecule->atoms;
- for(j = molecule->n_atoms; j--;)
- {
- len += sizeof(atom->id);
- if(!atom->name)
- {
- atom->name = (char *) malloc(1);
- if(!atom->name)
- {
- printf("Cannot allocate memory (1 byte). %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- atom->name[0] = 0;
- }
- len += min(strlen(atom->name) + 1, TRG_MAX_STR_LEN);
-
- if(!atom->atom_type)
- {
- atom->atom_type = (char *) malloc(1);
- if(!atom->atom_type)
- {
- printf("Cannot allocate memory (1 byte). %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- atom->atom_type[0] = 0;
- }
- len += min(strlen(atom->atom_type) + 1, TRG_MAX_STR_LEN);
-
- atom++;
- }
-
- bond = molecule->bonds;
- for(j = molecule->n_bonds; j--;)
- {
- len += sizeof(bond->from_atom_id) + sizeof(bond->to_atom_id);
- }
- }
-
- /* If just dumping the whole block_contents it is not certain that the
- * contents are known beforehand (e.g. due to different file versions) */
- if(mode == TRG_COPY_EXISTING)
- {
- if(trg_write_block_header(trg_data, block, mode) != TRG_SUCCESS)
- {
- printf("Cannot write header of file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(!block->block_contents)
- {
- printf("No block data to write. %s: %d\n", __FILE__, __LINE__);
- return(TRG_FAILURE);
- }
- if(fwrite(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all block data. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- return(TRG_SUCCESS);
- }
-
- block->block_contents_size = sizeof(trg_data->n_molecules) +
- (sizeof(molecule->id) +
- sizeof(molecule->quaternary_str) +
- sizeof(molecule->n_chains) +
- sizeof(molecule->n_residues) +
- sizeof(molecule->n_atoms) +
- sizeof(molecule->n_bonds)) *
- trg_data->n_molecules +
- len;
-
- if(!trg_data->var_num_atoms_flag)
- {
- block->block_contents_size += trg_data->n_molecules * sizeof(int64_t);
- }
-
- if(block->block_contents)
- {
- free(block->block_contents);
- }
- block->block_contents = (char *) malloc(block->block_contents_size);
- if(!block->block_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->block_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- memcpy(block->block_contents+offset, &trg_data->n_molecules,
- sizeof(trg_data->n_molecules));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(trg_data->n_molecules);
-
- for(i = 0; i < trg_data->n_molecules; i++)
- {
- molecule = &trg_data->molecules[i];
-// printf("i=%d\n", i);
- memcpy(block->block_contents+offset, &molecule->id,
- sizeof(molecule->id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(molecule->id);
-
-// printf("Wrote id: %"PRId64" offset: %d\n", molecule->id, offset);
- len = min(strlen(molecule->name) + 1, TRG_MAX_STR_LEN);
- strncpy(block->block_contents + offset, molecule->name, len);
- offset += len;
-
- memcpy(block->block_contents+offset, &molecule->quaternary_str,
- sizeof(molecule->quaternary_str));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(molecule->quaternary_str);
-
- if(!trg_data->var_num_atoms_flag)
- {
- memcpy(block->block_contents+offset,
- &trg_data->molecule_cnt_list[i], sizeof(int64_t));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(int64_t);
- }
-
- memcpy(block->block_contents+offset, &molecule->n_chains,
- sizeof(molecule->n_chains));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(molecule->n_chains);
-
- memcpy(block->block_contents+offset, &molecule->n_residues,
- sizeof(molecule->n_residues));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(molecule->n_residues);
-
- memcpy(block->block_contents+offset, &molecule->n_atoms,
- sizeof(molecule->n_atoms));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(molecule->n_atoms);
-
- chain = molecule->chains;
- for(j = molecule->n_chains; j--;)
- {
- memcpy(block->block_contents+offset, &chain->id, sizeof(chain->id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(chain->id);
-
- len = min(strlen(chain->name) + 1, TRG_MAX_STR_LEN);
- strncpy(block->block_contents + offset, chain->name, len);
- offset += len;
-
- memcpy(block->block_contents+offset, &chain->n_residues,
- sizeof(chain->n_residues));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(chain->n_residues);
-
- residue = chain->residues;
- for(k = chain->n_residues; k--;)
- {
- memcpy(block->block_contents+offset, &residue->id, sizeof(residue->id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(residue->id);
-
- len = min(strlen(residue->name) + 1, TRG_MAX_STR_LEN);
- strncpy(block->block_contents + offset, residue->name, len);
- offset += len;
-
- memcpy(block->block_contents+offset, &residue->n_atoms,
- sizeof(residue->n_atoms));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(residue->n_atoms);
-
- atom = residue->atoms;
- for(l = residue->n_atoms; l--;)
- {
- // printf("j=%d\n", j);
- memcpy(block->block_contents+offset, &atom->id, sizeof(atom->id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(atom->id);
-
- len = min(strlen(atom->name) + 1, TRG_MAX_STR_LEN);
- strncpy(block->block_contents + offset, atom->name, len);
- offset += len;
-
- len = min(strlen(atom->atom_type) + 1, TRG_MAX_STR_LEN);
- strncpy(block->block_contents + offset, atom->atom_type, len);
- offset += len;
-
- atom++;
- }
- residue++;
- }
- chain++;
- }
-
- memcpy(block->block_contents+offset, &molecule->n_bonds,
- sizeof(molecule->n_bonds));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(molecule->n_bonds);
-
- bond = molecule->bonds;
- for(j = molecule->n_bonds; j--;)
- {
- memcpy(block->block_contents+offset, &bond->from_atom_id,
- sizeof(bond->from_atom_id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(bond->from_atom_id);
-
- memcpy(block->block_contents+offset, &bond->to_atom_id,
- sizeof(bond->to_atom_id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset)) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(bond->to_atom_id);
-
- bond++;
- }
- }
-
- if(trg_write_block_header(trg_data, block, mode) != TRG_SUCCESS)
- {
- printf("Cannot write header of file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(fwrite(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all block data. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- return(TRG_SUCCESS);
-}
-
-
-static trg_function_status trg_read_frame_set_block
- (struct trg_trajectory *trg_data,
- struct trg_gen_block *block)
-{
- int i, file_pos, offset = 0;
- int64_t prev_n_particles;
- trg_bool same_hash;
- struct trg_trajectory_frame_set *frame_set =
- &trg_data->current_trajectory_frame_set;
- struct trg_particle_mapping *mapping;
-
- if(trg_init_input_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(block->block_contents)
- {
- free(block->block_contents);
- }
-
- block->block_contents = (char *) malloc(block->block_contents_size);
- if(!block->block_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->block_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* Read the whole block into block_contents to be able to write it to
- * disk even if it cannot be interpreted. */
- if(fread(block->block_contents, block->block_contents_size, 1,
- trg_data->input_file) == 0)
- {
- printf("Cannot read block. %s: %d\n", __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* FIXME: Does not check if the size of the contents matches the expected
- * size or if the contents can be read. */
-
- if(trg_verify_hash_match(block, &same_hash) != TRG_SUCCESS)
- {
- printf("Error comparing hashes. %s: %d\n", __FILE__, __LINE__);
- return(TRG_FAILURE);
- }
- if(same_hash != TRUE)
- {
- printf("Frame set block contents corrupt. Hashes do not match. "
- "%s: %d\n",
- __FILE__, __LINE__);
-// return(TRG_FAILURE);
- }
-
- file_pos = ftell(trg_data->input_file);
-
- if(frame_set->n_mapping_blocks && frame_set->mappings)
- {
- for(i = frame_set->n_mapping_blocks; i--;)
- {
- mapping = &frame_set->mappings[i];
- if(mapping->real_particle_numbers)
- {
- free(mapping->real_particle_numbers);
- mapping->real_particle_numbers = 0;
- }
- }
- free(frame_set->mappings);
- frame_set->n_mapping_blocks = 0;
- }
-
- if(trg_data->first_trajectory_frame_set_input_file_pos <= 0)
- {
- trg_data->first_trajectory_frame_set_input_file_pos = file_pos;
- }
- /* FIXME: Should check the frame number instead of the file_pos, in case
- * frame sets are not in order */
- if(trg_data->last_trajectory_frame_set_input_file_pos < file_pos)
- {
- trg_data->last_trajectory_frame_set_input_file_pos = file_pos;
- }
-
- memcpy(&frame_set->first_frame, block->block_contents,
- sizeof(frame_set->first_frame));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &frame_set->first_frame) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(frame_set->first_frame);
-
- memcpy(&frame_set->n_frames, block->block_contents + offset,
- sizeof(frame_set->n_frames));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &frame_set->n_frames) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(frame_set->n_frames);
-
- if(trg_data->var_num_atoms_flag)
- {
- prev_n_particles = frame_set->n_particles;
- frame_set->n_particles = 0;
- /* If the list of molecule counts has already been created assume that
- * it is of correct size. */
- if(!frame_set->molecule_cnt_list)
- {
- frame_set->molecule_cnt_list =
- (int64_t *) malloc(sizeof(int64_t) * trg_data->n_molecules);
-
- if(!frame_set->molecule_cnt_list)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- sizeof(int64_t) * trg_data->n_molecules,
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- }
- for(i = 0; i < trg_data->n_molecules; i++)
- {
- memcpy(&frame_set->molecule_cnt_list[i],
- block->block_contents + offset,
- sizeof(int64_t));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- &frame_set->molecule_cnt_list[i]) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(int64_t);
- frame_set->n_particles += trg_data->molecules[i].n_atoms *
- frame_set->molecule_cnt_list[i];
- }
- if(prev_n_particles && frame_set->n_particles != prev_n_particles)
- {
- /* FIXME: Particle dependent data memory management */
- }
- }
-
- memcpy(&frame_set->next_frame_set_file_pos,
- block->block_contents + offset,
- sizeof(frame_set->next_frame_set_file_pos));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- &frame_set->next_frame_set_file_pos) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(frame_set->next_frame_set_file_pos);
-
- memcpy(&frame_set->prev_frame_set_file_pos,
- block->block_contents + offset,
- sizeof(frame_set->prev_frame_set_file_pos));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- &frame_set->prev_frame_set_file_pos) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(frame_set->prev_frame_set_file_pos);
-
- memcpy(&frame_set->long_stride_next_frame_set_file_pos,
- block->block_contents + offset,
- sizeof(frame_set->long_stride_next_frame_set_file_pos));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- &frame_set->
- long_stride_next_frame_set_file_pos) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(frame_set->long_stride_next_frame_set_file_pos);
-
- memcpy(&frame_set->long_stride_prev_frame_set_file_pos,
- block->block_contents + offset,
- sizeof(frame_set->long_stride_prev_frame_set_file_pos));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- &frame_set->
- long_stride_prev_frame_set_file_pos) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(frame_set->long_stride_prev_frame_set_file_pos);
-
-// frame_set->n_double_particle_data_blocks = 0;
-// frame_set->n_float_particle_data_blocks = 0;
-// frame_set->n_int_particle_data_blocks = 0;
-// frame_set->n_gen_particle_data_blocks = 0;
-// frame_set->n_double_data_blocks = 0;
-// frame_set->n_float_data_blocks = 0;
-// frame_set->n_int_data_blocks = 0;
-// frame_set->n_gen_data_blocks = 0;
-
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_write_frame_set_block
- (struct trg_trajectory *trg_data,
- struct trg_gen_block *block,
- write_mode mode)
-{
- char *temp_name;
- int64_t i;
- int offset = 0, name_len;
- struct trg_trajectory_frame_set *frame_set =
- &trg_data->current_trajectory_frame_set;
-
- if(trg_init_output_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* If just dumping the whole block_contents it is not certain that the
- * contents are known beforehand (e.g. due to different file versions) */
- if(mode == TRG_COPY_EXISTING)
- {
- if(trg_write_block_header(trg_data, block, mode) != TRG_SUCCESS)
- {
- printf("Cannot write header of file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(!block->block_contents)
- {
- printf("No block data to write. %s: %d\n", __FILE__, __LINE__);
- return(TRG_FAILURE);
- }
- if(fwrite(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all block data. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- return(TRG_SUCCESS);
- }
-
- name_len = strlen("TRAJECTORY FRAME SET");
-
- if(!block->name || strlen(block->name) < name_len)
- {
- temp_name = realloc(block->name, name_len + 1);
- if(!temp_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n",
- name_len+1, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- block->name = temp_name;
- }
- strcpy(block->name, "TRAJECTORY FRAME SET");
-
- block->block_contents_size = sizeof(int64_t) * 6;
- if(trg_data->var_num_atoms_flag)
- {
- block->block_contents_size += sizeof(int64_t) * trg_data->n_molecules;
- }
-
- if(block->block_contents)
- {
- free(block->block_contents);
- }
- block->block_contents = (char *) malloc(block->block_contents_size);
- if(!block->block_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->block_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- memcpy(block->block_contents, &frame_set->first_frame,
- sizeof(frame_set->first_frame));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(frame_set->first_frame);
-
- memcpy(block->block_contents+offset, &frame_set->n_frames,
- sizeof(frame_set->n_frames));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(frame_set->n_frames);
-
- if(trg_data->var_num_atoms_flag)
- {
- for(i = 0; i < trg_data->n_molecules; i++)
- {
- memcpy(block->block_contents+offset,
- &frame_set->molecule_cnt_list[i],
- sizeof(int64_t));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(int64_t);
- }
- }
-
-
- memcpy(block->block_contents+offset, &frame_set->next_frame_set_file_pos,
- sizeof(frame_set->next_frame_set_file_pos));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(frame_set->next_frame_set_file_pos);
-
- memcpy(block->block_contents+offset, &frame_set->prev_frame_set_file_pos,
- sizeof(frame_set->prev_frame_set_file_pos));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(frame_set->prev_frame_set_file_pos);
-
- memcpy(block->block_contents+offset,
- &frame_set->long_stride_next_frame_set_file_pos,
- sizeof(frame_set->long_stride_next_frame_set_file_pos));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(frame_set->long_stride_next_frame_set_file_pos);
-
- memcpy(block->block_contents+offset,
- &frame_set->long_stride_prev_frame_set_file_pos,
- sizeof(frame_set->long_stride_prev_frame_set_file_pos));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(frame_set->long_stride_prev_frame_set_file_pos);
-
- if(trg_write_block_header(trg_data, block, mode) != TRG_SUCCESS)
- {
- printf("Cannot write header of file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(fwrite(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all block data. %s: %d\n", __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_read_trajectory_toc_block
- (struct trg_trajectory *trg_data,
- struct trg_gen_block *block)
-{
- int64_t i, old_n_blocks;
- int offset = 0, len;
- trg_bool same_hash;
- struct trg_frame_set_toc *toc =
- &trg_data->current_trajectory_frame_set.contents;
-
- if(trg_init_input_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(block->block_contents)
- {
- free(block->block_contents);
- }
-
- block->block_contents = (char *) malloc(block->block_contents_size);
- if(!block->block_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->block_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* Read the whole block into block_contents to be able to write it to disk
- * even if it cannot be interpreted. */
- if(fread(block->block_contents, block->block_contents_size, 1,
- trg_data->input_file) == 0)
- {
- printf("Cannot read block. %s: %d\n", __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* FIXME: Does not check if the size of the contents matches the expected
- * size or if the contents can be read. */
-
-
- if(trg_verify_hash_match(block, &same_hash) != TRG_SUCCESS)
- {
- printf("Error comparing hashes. %s: %d\n", __FILE__, __LINE__);
- return(TRG_FAILURE);
- }
- if(same_hash != TRUE)
- {
- printf("Table of contents block contents corrupt. Hashes do not match. "
- "%s: %d\n",
- __FILE__, __LINE__);
-// return(TRG_FAILURE);
- }
-
- old_n_blocks = toc->n_blocks;
-
- memcpy(&toc->n_blocks, block->block_contents,
- sizeof(toc->n_blocks));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &toc->n_blocks) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(toc->n_blocks);
-
- if(old_n_blocks != toc->n_blocks)
- {
- if(toc->block_names)
- {
- for(i = old_n_blocks; i--;)
- {
- if(toc->block_names[i])
- {
- free(toc->block_names[i]);
- }
- }
- free(toc->block_names);
- }
- toc->block_names = (char **) malloc(toc->n_blocks * sizeof(char *));
- if(!toc->block_names)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- toc->n_blocks * sizeof(int64_t), __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- }
-
- for(i = 0; i < toc->n_blocks; i++)
- {
- len = min(strlen(block->block_contents+offset) + 1, TRG_MAX_STR_LEN);
-
- toc->block_names[i] = (char *) malloc(len);
- if(!toc->block_names[i])
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n",
- len, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
-
- strncpy(toc->block_names[i], block->block_contents+offset, len);
-
- offset += len;
- }
-
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_write_trajectory_toc_block
- (struct trg_trajectory *trg_data,
- struct trg_gen_block *block,
- write_mode mode)
-{
- char *temp_name;
- int64_t i;
- int offset = 0, name_len;
- struct trg_frame_set_toc *toc =
- &trg_data->current_trajectory_frame_set.contents;
-
- if(trg_init_output_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* If just dumping the whole block_contents it is not certain that the
- * contents are known beforehand (e.g. due to different file versions) */
- if(mode == TRG_COPY_EXISTING)
- {
- if(trg_write_block_header(trg_data, block, mode) != TRG_SUCCESS)
- {
- printf("Cannot write header of file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(!block->block_contents)
- {
- printf("No block data to write. %s: %d\n", __FILE__, __LINE__);
- return(TRG_FAILURE);
- }
- if(fwrite(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all block data. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- return(TRG_SUCCESS);
- }
-
- name_len = strlen("BLOCK TABLE OF CONTENTS");
-
- if(!block->name || strlen(block->name) < name_len)
- {
- temp_name = realloc(block->name, name_len + 1);
- if(!temp_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n",
- name_len+1, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- block->name = temp_name;
- }
- strcpy(block->name, "BLOCK TABLE OF CONTENTS");
-
- block->block_contents_size = sizeof(int64_t);
-
- for(i = toc->n_blocks; i--;)
- {
- block->block_contents_size += strlen(toc->block_names[i]) + 1;
- }
-
- if(block->block_contents)
- {
- free(block->block_contents);
- }
- block->block_contents = (char *) malloc(block->block_contents_size);
- if(!block->block_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->block_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- memcpy(block->block_contents, &toc->n_blocks, sizeof(toc->n_blocks));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(toc->n_blocks);
-
- for(i = 0; i < toc->n_blocks; i++)
- {
- name_len = strlen(toc->block_names[i]) + 1;
- strncpy(block->block_contents+offset, toc->block_names[i], name_len);
- offset += name_len;
- }
-
-
- if(trg_write_block_header(trg_data, block, mode) != TRG_SUCCESS)
- {
- printf("Cannot write header of file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(fwrite(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all block data. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_read_trajectory_mapping_block
- (struct trg_trajectory *trg_data,
- struct trg_gen_block *block)
-{
- int64_t i, old_n_particles;
- int offset = 0;
- trg_bool same_hash;
- struct trg_trajectory_frame_set *frame_set =
- &trg_data->current_trajectory_frame_set;
-
- struct trg_particle_mapping *mapping, *mappings;
-
- if(trg_init_input_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(block->block_contents)
- {
- free(block->block_contents);
- }
-
- block->block_contents = (char *) malloc(block->block_contents_size);
- if(!block->block_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->block_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* Read the whole block into block_contents to be able to write it to disk
- * even if it cannot be interpreted. */
- if(fread(block->block_contents, block->block_contents_size, 1,
- trg_data->input_file) == 0)
- {
- printf("Cannot read block. %s: %d\n", __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* FIXME: Does not check if the size of the contents matches the expected
- * size or if the contents can be read. */
-
-
- if(trg_verify_hash_match(block, &same_hash) != TRG_SUCCESS)
- {
- printf("Error comparing hashes. %s: %d\n", __FILE__, __LINE__);
- return(TRG_FAILURE);
- }
- if(same_hash != TRUE)
- {
- printf("Particle mapping block contents corrupt. Hashes do not match. "
- "%s: %d\n",
- __FILE__, __LINE__);
-// return(TRG_FAILURE);
- }
-
- frame_set->n_mapping_blocks++;
- mappings = realloc(frame_set->mappings,
- sizeof(struct trg_particle_mapping) *
- frame_set->n_mapping_blocks);
- if(!mappings)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->block_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- frame_set->mappings = mappings;
- mapping = &mappings[frame_set->n_mapping_blocks - 1];
-
-
- memcpy(&mapping->num_first_particle, block->block_contents+offset,
- sizeof(mapping->num_first_particle));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &mapping->num_first_particle) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(mapping->num_first_particle);
-
- old_n_particles = mapping->n_particles;
-
- memcpy(&mapping->n_particles, block->block_contents+offset,
- sizeof(mapping->n_particles));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &mapping->n_particles) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(mapping->n_particles);
-
- if(old_n_particles != mapping->n_particles)
- {
- if(mapping->real_particle_numbers)
- {
- free(mapping->real_particle_numbers);
- }
- mapping->real_particle_numbers = malloc(mapping->n_particles *
- sizeof(int64_t));
- if(!mapping->real_particle_numbers)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- mapping->n_particles * sizeof(int64_t), __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- }
-
- for(i = 0; i < mapping->n_particles; i++)
- {
- memcpy(&mapping->real_particle_numbers[i],
- block->block_contents + offset,
- sizeof(int64_t));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- &mapping->real_particle_numbers[i]) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(int64_t);
- }
-
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_write_trajectory_mapping_block
- (struct trg_trajectory *trg_data,
- struct trg_gen_block *block,
- int mapping_block_nr,
- write_mode mode)
-{
- char *temp_name;
- int i, offset = 0, name_len;
- struct trg_particle_mapping *mapping =
- &trg_data->current_trajectory_frame_set.mappings[mapping_block_nr];
-
- if(mapping_block_nr >=
- trg_data->current_trajectory_frame_set.n_mapping_blocks)
- {
- printf("Mapping block index out of bounds. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(trg_init_output_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* If just dumping the whole block_contents it is not certain that the
- * contents are known beforehand (e.g. due to different file versions) */
- if(mode == TRG_COPY_EXISTING)
- {
- if(trg_write_block_header(trg_data, block, mode) != TRG_SUCCESS)
- {
- printf("Cannot write header of file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(!block->block_contents)
- {
- printf("No block data to write. %s: %d\n", __FILE__, __LINE__);
- return(TRG_FAILURE);
- }
- if(fwrite(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all block data. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- return(TRG_SUCCESS);
- }
-
- name_len = strlen("PARTICLE MAPPING");
-
- if(!block->name || strlen(block->name) < name_len)
- {
- temp_name = realloc(block->name, name_len + 1);
- if(!temp_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n",
- name_len+1, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- block->name = temp_name;
- }
- strcpy(block->name, "PARTICLE MAPPING");
-
- block->block_contents_size = sizeof(int64_t) * (2 + mapping->n_particles);
-
- if(block->block_contents)
- {
- free(block->block_contents);
- }
- block->block_contents = (char *) malloc(block->block_contents_size);
- if(!block->block_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->block_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- memcpy(block->block_contents, &mapping->num_first_particle,
- sizeof(mapping->num_first_particle));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(mapping->num_first_particle);
-
- memcpy(block->block_contents+offset, &mapping->n_particles,
- sizeof(mapping->n_particles));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(mapping->n_particles);
-
- for(i = 0; i < mapping->n_particles; i++)
- {
- memcpy(block->block_contents+offset, &mapping->real_particle_numbers[i],
- sizeof(int64_t));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(int64_t);
- }
-
-
- if(trg_write_block_header(trg_data, block, mode) != TRG_SUCCESS)
- {
- printf("Cannot write header of file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(fwrite(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all block data. %s: %d\n", __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_create_particle_data_block
- (struct trg_trajectory *trg_data,
- const trg_block_type block_type_flag)
-{
- struct trg_trajectory_frame_set *frame_set =
- &trg_data->current_trajectory_frame_set;
-
- struct trg_particle_data *data;
-
- if(block_type_flag == TRG_TRAJECTORY_BLOCK)
- {
- frame_set->n_particle_data_blocks++;
- data = realloc(frame_set->tr_particle_data,
- sizeof(struct trg_particle_data) *
- frame_set->n_particle_data_blocks);
- if(!data)
- {
- printf("Cannot allocate memory (%lu bytes). %s: %d\n",
- sizeof(struct trg_particle_data) *
- frame_set->n_particle_data_blocks,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- frame_set->tr_particle_data = data;
- data = &frame_set->tr_particle_data[frame_set->
- n_particle_data_blocks - 1];
- }
- else
- {
- trg_data->n_particle_data_blocks++;
- data = realloc(trg_data->non_tr_particle_data,
- sizeof(struct trg_particle_data) *
- trg_data->n_particle_data_blocks);
- if(!data)
- {
- printf("Cannot allocate memory (%lu bytes). %s: %d\n",
- sizeof(struct trg_particle_data) *
- trg_data->n_particle_data_blocks,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- trg_data->non_tr_particle_data = data;
- data = &trg_data->non_tr_particle_data[trg_data->
- n_particle_data_blocks - 1];
- }
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_allocate_particle_data_mem
- (struct trg_trajectory *trg_data,
- struct trg_particle_data *data,
- int64_t n_frames,
- const int64_t n_particles,
- const int64_t n_values_per_frame)
-{
- union data_values ***values;
- int64_t i, j, k;
-
- for(i = data->n_frames; i--;)
- {
- for(j = n_particles; j--;)
- {
- free(data->values[i][j]);
- }
- free(data->values[i]);
- }
- data->n_frames = n_frames;
- n_frames = max(1, n_frames);
- data->n_values_per_frame = n_values_per_frame;
- values = (union data_values ***) realloc(data->values,
- sizeof(union data_values **) *
- n_frames);
- if(!values)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- sizeof(union data_values **) * n_frames,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- data->values = values;
-
- for(i = n_frames; i-- ;)
- {
- data->values[i] = (union data_values **)
- malloc(sizeof(union data_values *) *
- n_particles);
- if(!data->values[i])
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- sizeof(union data_values *) * n_particles,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- for(j = n_particles; j--;)
- {
- data->values[i][j] = (union data_values *)
- malloc(sizeof(union data_values) *
- n_values_per_frame);
- if(!data->values[i][j])
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- sizeof(union data_values) * n_values_per_frame,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- if(data->datatype == TRG_CHAR_DATA)
- {
- for(k = n_values_per_frame; k--;)
- {
- data->values[i][j][k].c = 0;
- }
- }
- }
- }
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_read_particle_data
- (struct trg_trajectory *trg_data,
- struct trg_gen_block *block,
- int *offset,
- const char datatype,
- const int64_t first_particle_number,
- const int64_t n_particles,
- const int64_t first_frame_with_data,
- const int64_t stride_length,
- int64_t n_frames,
- const int64_t n_values,
- const int64_t codec_id,
- const int64_t multiplier)
-{
- int64_t block_index, i, j, k, tot_n_particles;
- int size, len;
- struct trg_particle_data *data;
- struct trg_trajectory_frame_set *frame_set =
- &trg_data->current_trajectory_frame_set;
- trg_block_type block_type_flag;
-
- switch(datatype)
- {
- case TRG_CHAR_DATA:
- size = 1;
- break;
- case TRG_INT_DATA:
- size = sizeof(int64_t);
- break;
- case TRG_FLOAT_DATA:
- size = sizeof(float);
- break;
- case TRG_DOUBLE_DATA:
- default:
- size = sizeof(double);
- }
-
- if(trg_data->current_trajectory_frame_set_input_file_pos > 0)
- {
- block_type_flag = TRG_TRAJECTORY_BLOCK;
- }
- else
- {
- block_type_flag = TRG_NON_TRAJECTORY_BLOCK;
- }
-
- block_index = -1;
- /* See if there is already a data block of this ID */
- if(block_type_flag == TRG_TRAJECTORY_BLOCK)
- {
- for(i = frame_set->n_particle_data_blocks; i-- ;)
- {
- data = &frame_set->tr_particle_data[i];
- if(data->block_id == block->id)
- {
- block_index = i;
- break;
- }
- }
- }
- else
- {
- for(i = trg_data->n_particle_data_blocks; i-- ;)
- {
- data = &trg_data->non_tr_particle_data[i];
- if(data->block_id == block->id)
- {
- block_index = i;
- break;
- }
- }
- }
-
- /* Otherwise create a data block */
- if(block_index == -1)
- {
- if(trg_create_particle_data_block(trg_data, block_type_flag) !=
- TRG_SUCCESS)
- {
- printf("Cannot create particle data block. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- if(block_type_flag == TRG_TRAJECTORY_BLOCK)
- {
- data = &frame_set->tr_particle_data[frame_set->
- n_particle_data_blocks - 1];
- }
- else
- {
- data = &trg_data->non_tr_particle_data[trg_data->
- n_particle_data_blocks - 1];
- }
- data->block_id = block->id;
-
- data->block_name = malloc(strlen(block->name) + 1);
- if(!data->block_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n",
- (int)strlen(block->name)+1, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- strcpy(data->block_name, block->name);
-
- data->datatype = datatype;
-
- data->values = 0;
- data->n_frames = 0;
- data->codec_id = codec_id;
- data->compression_multiplier = multiplier;
- }
-
- if(block_type_flag == TRG_TRAJECTORY_BLOCK &&
- trg_data->var_num_atoms_flag)
- {
- tot_n_particles = frame_set->n_particles;
- }
- else
- {
- tot_n_particles = trg_data->n_particles;
- }
-
- /* Allocate memory */
- if(!data->values || data->n_frames != n_frames ||
- data->n_values_per_frame != n_values)
- {
- if(trg_allocate_particle_data_mem(trg_data, data, n_frames,
- tot_n_particles, n_values) !=
- TRG_SUCCESS)
- {
- printf("Cannot allocate memory for particle data. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- data->first_frame_with_data = first_frame_with_data;
- data->stride_length = stride_length;
-
- for(i = 0; i < n_frames; i++)
- {
- for(j = first_particle_number; j < n_particles; j++)
- {
- for(k = 0; k < n_values; k++)
- {
- /* FIXME: Not optimal to have this switch statement inside
- * the for loops. Check if it should be moved outside. */
- switch(datatype)
- {
- case TRG_FLOAT_DATA:
- memcpy(&data->values[i][j][k].f,
- block->block_contents+*offset,
- size);
- if(trg_data->endianness_32 != TRG_BIG_ENDIAN_32)
- {
- if(trg_swap_byte_order_32(trg_data,
- (int32_t *) &data->values[i][j][k]) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. "
- "%s: %d\n",
- __FILE__, __LINE__);
- }
- }
- *offset += size;
- break;
- case TRG_INT_DATA:
- memcpy(&data->values[i][j][k].i,
- block->block_contents+*offset,
- size);
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *) &data->values[i][j][k].i) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. "
- "%s: %d\n",
- __FILE__, __LINE__);
- }
- }
- *offset += size;
- break;
- case TRG_CHAR_DATA:
- len = min(strlen(block->block_contents+*offset) + 1,
- TRG_MAX_STR_LEN);
- if(data->values[i][j][k].c)
- {
- free(data->values[i][j][k].c);
- }
- data->values[i][j][k].c = malloc(len);
- if(!data->values[i][j][k].c)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n",
- len, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- strncpy(data->values[i][j][k].c,
- block->block_contents+*offset, len);
- *offset += len;
- break;
- case TRG_DOUBLE_DATA:
- default:
- memcpy(&data->values[i][j][k].d,
- block->block_contents+*offset,
- size);
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *) &data->values[i][j][k].d) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. "
- "%s: %d\n",
- __FILE__, __LINE__);
- }
- }
- *offset += size;
- }
- }
- }
- }
- return(TRG_SUCCESS);
-}
-
-
-static trg_function_status trg_write_particle_data_block
- (struct trg_trajectory *trg_data,
- struct trg_gen_block *block,
- const int block_index,
- const struct trg_particle_mapping *mapping,
- const write_mode mode)
-{
- int64_t n_particles, num_first_particle, n_frames;
- int i, j, k, offset = 0, size, len;
- char temp, *temp_name;
- struct trg_trajectory_frame_set *frame_set =
- &trg_data->current_trajectory_frame_set;
-
- struct trg_particle_data *data;
-
- if(trg_init_output_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(trg_data->current_trajectory_frame_set_output_file_pos > 0)
- {
- data = &frame_set->tr_particle_data[block_index];
- }
- else
- {
- data = &trg_data->non_tr_particle_data[block_index];
- }
-
- switch(data->datatype)
- {
- case TRG_CHAR_DATA:
- size = 1;
- break;
- case TRG_INT_DATA:
- size = sizeof(int64_t);
- break;
- case TRG_FLOAT_DATA:
- size = sizeof(float);
- break;
- case TRG_DOUBLE_DATA:
- default:
- size = sizeof(double);
- }
-
- len = strlen(data->block_name) + 1;
-
- /* If just dumping the whole block_contents it is not certain that the
- * contents are known beforehand (e.g. due to different file versions) */
- if(mode == TRG_COPY_EXISTING)
- {
- if(trg_write_block_header(trg_data, block, mode) != TRG_SUCCESS)
- {
- printf("Cannot write header of file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(!block->block_contents)
- {
- printf("No block data to write. %s: %d\n", __FILE__, __LINE__);
- return(TRG_FAILURE);
- }
- if(fwrite(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all block data. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- return(TRG_SUCCESS);
- }
-
- if(!block->name || strlen(block->name) < len)
- {
- temp_name = realloc(block->name, len);
- if(!temp_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- block->name = temp_name;
- }
- strncpy(block->name, data->block_name, len);
-
- /* If writing frame independent data data->n_frames is be 0, but n_frames
- is used for the loop writing the data (and reserving memory) and needs
- to be at least 1 */
- n_frames = max(1, data->n_frames);
-
-
- if(mapping && mapping->n_particles != 0)
- {
- n_particles = mapping->n_particles;
- num_first_particle = mapping->num_first_particle;
- }
- else
- {
- num_first_particle = 0;
- if(trg_data->var_num_atoms_flag)
- {
- n_particles = frame_set->n_particles;
- }
- else
- {
- n_particles = trg_data->n_particles;
- }
- }
-
- block->block_contents_size = sizeof(char) * 3 +
- sizeof(data->n_values_per_frame) +
- sizeof(data->codec_id) +
- sizeof(num_first_particle) +
- sizeof(n_particles);
-
- if(data->codec_id != TRG_UNCOMPRESSED)
- {
- block->block_contents_size += sizeof(data->compression_multiplier);
- }
-
- if(data->datatype == TRG_CHAR_DATA)
- {
- for(i = n_frames; i--;)
- {
- for(j = num_first_particle; j < n_particles; j++)
- {
- for(k = data->n_values_per_frame; k--;)
- {
- block->block_contents_size +=
- strlen(data->values[i][j][k].c) + 1;
- }
- }
- }
- }
- else
- {
- block->block_contents_size += size * n_frames * n_particles *
- data->n_values_per_frame;
- }
-
- if(block->block_contents)
- {
- free(block->block_contents);
- }
- block->block_contents = (char *) malloc(block->block_contents_size);
- if(!block->block_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->block_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
-
- memcpy(block->block_contents, &data->datatype, sizeof(char));
- offset += sizeof(char);
-
- if(data->n_frames > 0)
- {
- temp = TRG_FRAME_DEPENDENT + TRG_PARTICLE_DEPENDENT;
- }
- else
- {
- temp = TRG_PARTICLE_DEPENDENT;
- }
- memcpy(block->block_contents+offset, &temp, sizeof(char));
- offset += sizeof(char);
-
- if(data->n_frames > 0 && data->stride_length > 1)
- {
- temp = 1;
- }
- else
- {
- temp = 0;
- }
- memcpy(block->block_contents+offset, &temp, sizeof(char));
- offset += sizeof(char);
-
- memcpy(block->block_contents+offset, &data->n_values_per_frame,
- sizeof(data->n_values_per_frame));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents + offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(data->n_values_per_frame);
-
- memcpy(block->block_contents+offset, &data->codec_id,
- sizeof(data->codec_id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents + offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(data->codec_id);
-
- if(data->codec_id != TRG_UNCOMPRESSED)
- {
- memcpy(block->block_contents+offset, &data->compression_multiplier,
- sizeof(data->compression_multiplier));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents + offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(data->compression_multiplier);
- }
-
- if(data->n_frames > 0 && data->stride_length > 1)
- {
- memcpy(block->block_contents+offset, &data->first_frame_with_data,
- sizeof(data->first_frame_with_data));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents + offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(data->first_frame_with_data);
-
- memcpy(block->block_contents+offset, &data->stride_length,
- sizeof(data->stride_length));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents + offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(data->stride_length);
- }
-
-
- memcpy(block->block_contents+offset, &num_first_particle,
- sizeof(num_first_particle));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(num_first_particle);
-
- memcpy(block->block_contents+offset, &n_particles, sizeof(n_particles));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents+offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(n_particles);
-
-
- for(i = 0; i < data->n_frames; i++)
- {
- for(j = num_first_particle; j < n_particles; j++)
- {
- for(k = 0; k < data->n_values_per_frame; k++)
- {
- switch(data->datatype)
- {
- case TRG_FLOAT_DATA:
- memcpy(block->block_contents+offset,
- &data->values[i][j][k].f,
- size);
- break;
- case TRG_INT_DATA:
- memcpy(block->block_contents+offset,
- &data->values[i][j][k].i,
- size);
- break;
- case TRG_CHAR_DATA:
- len = strlen(data->values[i][j][k].c) + 1;
- strncpy(block->block_contents+offset,
- data->values[i][j][k].c, len);
- offset += len;
- break;
- case TRG_DOUBLE_DATA:
- default:
- memcpy(block->block_contents+offset,
- &data->values[i][j][k].d,
- size);
- }
- if(data->datatype == TRG_FLOAT_DATA)
- {
- if(trg_data->endianness_32 != TRG_BIG_ENDIAN_32)
- {
- if(trg_swap_byte_order_32(trg_data,
- (int32_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. "
- "%s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(size);
- }
- else if(data->datatype == TRG_INT_DATA ||
- data->datatype == TRG_DOUBLE_DATA)
- {
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. "
- "%s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(size);
- }
- }
- }
- }
-
-
-
- if(trg_write_block_header(trg_data, block, mode) != TRG_SUCCESS)
- {
- printf("Cannot write header of file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(fwrite(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all block data. %s: %d\n", __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- return(TRG_SUCCESS);
-}
-
-/* UNTESTED */
-static trg_function_status trg_create_data_block
- (struct trg_trajectory *trg_data,
- const trg_block_type block_type_flag)
-{
- struct trg_trajectory_frame_set *frame_set =
- &trg_data->current_trajectory_frame_set;
-
- struct trg_data *data;
-
- if(block_type_flag == TRG_TRAJECTORY_BLOCK)
- {
- frame_set->n_data_blocks++;
- data = realloc(frame_set->tr_data, sizeof(struct trg_data) *
- frame_set->n_data_blocks);
- if(!data)
- {
- printf("Cannot allocate memory (%lu bytes). %s: %d\n",
- sizeof(struct trg_data) * frame_set->n_data_blocks,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- frame_set->tr_data = data;
- data = &frame_set->tr_data[frame_set->n_data_blocks - 1];
- }
- else
- {
- trg_data->n_data_blocks++;
- data = realloc(trg_data->non_tr_data, sizeof(struct trg_data) *
- trg_data->n_data_blocks);
- if(!data)
- {
- printf("Cannot allocate memory (%lu bytes). %s: %d\n",
- sizeof(struct trg_data) * trg_data->n_data_blocks,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- trg_data->non_tr_data = data;
- data = &trg_data->non_tr_data[trg_data->n_data_blocks - 1];
- }
-
- return(TRG_SUCCESS);
-}
-
-/* UNTESTED */
-trg_function_status trg_allocate_data_mem
- (struct trg_trajectory *trg_data,
- struct trg_data *data,
- int64_t n_frames,
- const int64_t n_values_per_frame)
-{
- union data_values **values;
- int64_t i, j;
-
- for(i = data->n_frames; i--;)
- {
- if(data->datatype == TRG_CHAR_DATA)
- {
- for(j = data->n_values_per_frame; j--;)
- {
- if(data->values[i][j].c)
- {
- free(data->values[i][j].c);
- data->values[i][j].c = 0;
- }
- }
- }
- free(data->values[i]);
- }
- data->n_frames = n_frames;
- n_frames = max(1, n_frames);
- data->n_values_per_frame = n_values_per_frame;
- values = (union data_values **) realloc(data->values,
- sizeof(union data_values *) *
- n_frames);
- if(!values)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- sizeof(union data_values **) * n_frames,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- data->values = values;
-
- for(i = n_frames; i-- ;)
- {
- data->values[i] = (union data_values *)
- malloc(sizeof(union data_values) *
- n_values_per_frame);
- if(!data->values[i])
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- sizeof(union data_values) * n_values_per_frame,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- if(data->datatype == TRG_CHAR_DATA)
- {
- for(j = n_values_per_frame; j--;)
- {
- data->values[i][j].c = 0;
- }
- }
- }
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_read_data(struct trg_trajectory *trg_data,
- struct trg_gen_block *block,
- int *offset,
- const char datatype,
- const int64_t first_frame_with_data,
- const int64_t stride_length,
- int64_t n_frames,
- const int64_t n_values,
- const int64_t codec_id,
- const int64_t multiplier)
-{
- int64_t block_index, i, j;
- int size, len;
- struct trg_data *data;
- struct trg_trajectory_frame_set *frame_set =
- &trg_data->current_trajectory_frame_set;
- trg_block_type block_type_flag;
-
-// printf("%s\n", block->name);
-
- if(trg_data->current_trajectory_frame_set_input_file_pos > 0)
- {
- block_type_flag = TRG_TRAJECTORY_BLOCK;
- }
- else
- {
- block_type_flag = TRG_NON_TRAJECTORY_BLOCK;
- }
-
- switch(datatype)
- {
- case TRG_CHAR_DATA:
- size = 1;
- break;
- case TRG_INT_DATA:
- size = sizeof(int64_t);
- break;
- case TRG_FLOAT_DATA:
- size = sizeof(float);
- break;
- case TRG_DOUBLE_DATA:
- default:
- size = sizeof(double);
- }
-
- block_index = -1;
- /* See if there is already a data block of this ID */
- if(block_type_flag == TRG_TRAJECTORY_BLOCK)
- {
- for(i = frame_set->n_data_blocks; i-- ;)
- {
- data = &frame_set->tr_data[i];
- if(data->block_id == block->id)
- {
- block_index = i;
- break;
- }
- }
- }
- else
- {
- for(i = trg_data->n_data_blocks; i-- ;)
- {
- data = &trg_data->non_tr_data[i];
- if(data->block_id == block->id)
- {
- block_index = i;
- break;
- }
- }
- }
-
- /* Otherwise create a data block */
- if(block_index == -1)
- {
- if(trg_create_data_block(trg_data, block_type_flag) !=
- TRG_SUCCESS)
- {
- printf("Cannot create particle data block. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- if(block_type_flag == TRG_TRAJECTORY_BLOCK)
- {
- data = &frame_set->tr_data[frame_set->n_data_blocks - 1];
- }
- else
- {
- data = &trg_data->non_tr_data[trg_data->n_data_blocks - 1];
- }
- data->block_id = block->id;
-
- data->block_name = malloc(strlen(block->name) + 1);
- if(!data->block_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n",
- (int)strlen(block->name)+1, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- strcpy(data->block_name, block->name);
-
- data->datatype = datatype;
-
- data->values = 0;
- data->n_frames = 0;
- data->codec_id = codec_id;
- data->compression_multiplier = multiplier;
- }
-
- /* Allocate memory */
- if(!data->values || data->n_frames != n_frames ||
- data->n_values_per_frame != n_values)
- {
- if(trg_allocate_data_mem(trg_data, data, n_frames, n_values) !=
- TRG_SUCCESS)
- {
- printf("Cannot allocate memory for data. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- data->first_frame_with_data = first_frame_with_data;
- data->stride_length = stride_length;
-
- n_frames = max(1, n_frames);
-
- for(i = 0; i < n_frames; i++)
- {
- for(j = 0; j < n_values; j++)
- {
- switch(datatype)
- {
- case TRG_CHAR_DATA:
- len = min(strlen(block->block_contents+*offset) + 1,
- TRG_MAX_STR_LEN);
- if(data->values[i][j].c)
- {
- free(data->values[i][j].c);
- }
- data->values[i][j].c = malloc(len);
- if(!data->values[i][j].c)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n",
- len, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- strncpy(data->values[i][j].c, block->block_contents+*offset,
- len);
- *offset += len;
- break;
- case TRG_INT_DATA:
- memcpy(&data->values[i][j].i, block->block_contents+*offset,
- size);
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *) &data->values[i][j].i) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. "
- "%s: %d\n",
- __FILE__, __LINE__);
- }
- }
- *offset += size;
- break;
- case TRG_FLOAT_DATA:
- memcpy(&data->values[i][j].f, block->block_contents+*offset,
- size);
- if(trg_data->endianness_32 != TRG_BIG_ENDIAN_32)
- {
- if(trg_swap_byte_order_32(trg_data,
- (int32_t *) &data->values[i][j]) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. "
- "%s: %d\n",
- __FILE__, __LINE__);
- }
- }
- *offset += size;
- break;
- case TRG_DOUBLE_DATA:
- default:
- memcpy(&data->values[i][j].d, block->block_contents+*offset,
- size);
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *) &data->values[i][j].d) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. "
- "%s: %d\n",
- __FILE__, __LINE__);
- }
- }
- *offset += size;
- }
- }
- }
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_write_data_block(struct trg_trajectory *trg_data,
- struct trg_gen_block *block,
- const int block_index,
- const write_mode mode)
-{
- int64_t n_frames;
- int i, j, offset = 0, size, len;
- char temp, *temp_name;
- struct trg_trajectory_frame_set *frame_set =
- &trg_data->current_trajectory_frame_set;
-
- struct trg_data *data;
- trg_block_type block_type_flag;
-
- if(trg_data->current_trajectory_frame_set_output_file_pos > 0)
- {
- block_type_flag = TRG_TRAJECTORY_BLOCK;
- }
- else
- {
- block_type_flag = TRG_NON_TRAJECTORY_BLOCK;
- }
-
- if(trg_init_output_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(block_type_flag == TRG_TRAJECTORY_BLOCK)
- {
- data = &frame_set->tr_data[block_index];
- }
- else
- {
- data = &trg_data->non_tr_data[block_index];
- }
-
- switch(data->datatype)
- {
- case TRG_CHAR_DATA:
- size = 1;
- break;
- case TRG_INT_DATA:
- size = sizeof(int64_t);
- break;
- case TRG_FLOAT_DATA:
- size = sizeof(float);
- break;
- case TRG_DOUBLE_DATA:
- default:
- size = sizeof(double);
- }
-
- /* If just dumping the whole block_contents it is not certain that the
- * contents are known beforehand (e.g. due to different file versions) */
- if(mode == TRG_COPY_EXISTING)
- {
- if(trg_write_block_header(trg_data, block, mode) != TRG_SUCCESS)
- {
- printf("Cannot write header of file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(!block->block_contents)
- {
- printf("No block data to write. %s: %d\n", __FILE__, __LINE__);
- return(TRG_FAILURE);
- }
- if(fwrite(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all block data. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- return(TRG_SUCCESS);
- }
-
- len = strlen(data->block_name) + 1;
-
- if(!block->name || strlen(block->name) < len)
- {
- temp_name = realloc(block->name, len);
- if(!temp_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len+1,
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
- block->name = temp_name;
- }
- strncpy(block->name, data->block_name, len);
-
- /* If writing frame independent data data->n_frames is be 0, but n_frames
- is used for the loop writing the data (and reserving memory) and needs
- to be at least 1 */
- n_frames = max(1, data->n_frames);
-
-
- block->block_contents_size = sizeof(char) * 2 +
- sizeof(data->n_values_per_frame) +
- sizeof(data->codec_id);
-
- if(data->codec_id != TRG_UNCOMPRESSED)
- {
- block->block_contents_size += sizeof(data->compression_multiplier);
- }
-
- if(data->datatype == TRG_CHAR_DATA)
- {
- for(i = n_frames; i--;)
- {
- for(j = data->n_values_per_frame; j--;)
- {
- block->block_contents_size += strlen(data->values[i][j].c) + 1;
- }
- }
- }
- else
- {
- block->block_contents_size += size * n_frames *
- data->n_values_per_frame;
- }
-
- if(data->n_frames > 0 || data->stride_length != 0)
- {
- block->block_contents_size += sizeof(char);
- }
-
- if(block->block_contents)
- {
- free(block->block_contents);
- }
- block->block_contents = (char *) malloc(block->block_contents_size);
- if(!block->block_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->block_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
-
- memcpy(block->block_contents, &data->datatype, sizeof(char));
- offset += sizeof(char);
-
- if(data->n_frames > 0 || data->stride_length != 0)
- {
- temp = TRG_FRAME_DEPENDENT;
- }
- else
- {
- temp = 0;
- }
- memcpy(block->block_contents+offset, &temp, sizeof(char));
- offset += sizeof(char);
-
- if(data->n_frames > 0)
- {
- if(data->stride_length > 1)
- {
- temp = 1;
- }
- else
- {
- temp = 0;
- }
- memcpy(block->block_contents+offset, &temp, sizeof(char));
- offset += sizeof(char);
- }
-
- memcpy(block->block_contents+offset, &data->n_values_per_frame,
- sizeof(data->n_values_per_frame));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents + offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. "
- "%s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(data->n_values_per_frame);
-
- memcpy(block->block_contents+offset, &data->codec_id,
- sizeof(data->codec_id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents + offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. "
- "%s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(data->codec_id);
-
- if(data->codec_id != TRG_UNCOMPRESSED)
- {
- memcpy(block->block_contents+offset, &data->compression_multiplier,
- sizeof(data->compression_multiplier));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents + offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. "
- "%s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(data->compression_multiplier);
- }
-
- if(data->n_frames > 0 && data->stride_length > 1)
- {
- memcpy(block->block_contents+offset, &data->first_frame_with_data,
- sizeof(data->first_frame_with_data));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents + offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. "
- "%s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(data->first_frame_with_data);
-
- memcpy(block->block_contents+offset, &data->stride_length,
- sizeof(data->stride_length));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)
- (block->block_contents + offset)) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. "
- "%s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(data->stride_length);
- }
-
- for(i = 0; i < n_frames; i++)
- {
- for(j = 0; j < data->n_values_per_frame; j++)
- {
- switch(data->datatype)
- {
- case TRG_CHAR_DATA:
- len = strlen(data->values[i][j].c) + 1;
- strncpy(block->block_contents+offset, data->values[i][j].c,
- len);
- offset += len;
- break;
- case TRG_INT_DATA:
- memcpy(block->block_contents+offset, &data->values[i][j].i,
- size);
- break;
- case TRG_FLOAT_DATA:
- memcpy(block->block_contents+offset, &data->values[i][j].f,
- size);
- break;
- case TRG_DOUBLE_DATA:
- default:
- memcpy(block->block_contents+offset, &data->values[i][j].d,
- size);
- }
- if(data->datatype != TRG_CHAR_DATA)
- {
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- (int64_t *)(block->block_contents+offset))
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. "
- "%s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += size;
- }
- }
- }
-
- if(trg_write_block_header(trg_data, block, mode) != TRG_SUCCESS)
- {
- printf("Cannot write header of file %s. %s: %d\n",
- trg_data->output_file_path, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(fwrite(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) != 1)
- {
- printf("Could not write all block data. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_read_data_block_contents
- (struct trg_trajectory *trg_data,
- struct trg_gen_block *block)
-{
- int64_t n_values, codec_id, n_frames, first_frame_with_data;
- int64_t steps_between_data, block_n_particles, first_particle_number;
- double multiplier;
- char datatype, dependency, sparse_data;
- int offset = 0;
- trg_bool same_hash;
-
- if(trg_init_input_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- if(block->block_contents)
- {
- free(block->block_contents);
- }
-
- block->block_contents = (char *) malloc(block->block_contents_size);
- if(!block->block_contents)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- block->block_contents_size, __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* Read the whole block into block_contents to be able to write it to
- * disk even if it cannot be interpreted. */
- if(fread(block->block_contents, block->block_contents_size, 1,
- trg_data->input_file) == 0)
- {
- printf("Cannot read block. %s: %d\n", __FILE__, __LINE__);
- trg_destroy_block(block);
- return(TRG_CRITICAL);
- }
-
- /* FIXME: Does not check if the size of the contents matches the expected
- * size or if the contents can be read. */
-
-
- if(trg_verify_hash_match(block, &same_hash) != TRG_SUCCESS)
- {
- printf("Error comparing hashes. %s: %d\n", __FILE__, __LINE__);
- return(TRG_FAILURE);
- }
- if(same_hash != TRUE)
- {
- printf("%s\n", block->hash);
- printf("Data block contents corrupt. Hashes do not match. %s: %d\n",
- __FILE__, __LINE__);
-// return(TRG_FAILURE);
- }
-
- memcpy(&datatype, block->block_contents+offset,
- sizeof(datatype));
- offset += sizeof(datatype);
-
- memcpy(&dependency, block->block_contents+offset,
- sizeof(dependency));
- offset += sizeof(dependency);
-
-// memcpy(&var_n_particles, block->block_contents+offset,
-// sizeof(var_n_particles));
-// offset += sizeof(var_n_particles);
-
- if(dependency & TRG_FRAME_DEPENDENT)
- {
- memcpy(&sparse_data, block->block_contents+offset,
- sizeof(sparse_data));
- offset += sizeof(sparse_data);
- }
-
-// memcpy(&var_n_values, block->block_contents+offset,
-// sizeof(var_n_values));
-// offset += sizeof(var_n_values);
-//
-// if(!var_n_values)
-// {
- memcpy(&n_values, block->block_contents+offset,
- sizeof(n_values));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &n_values) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(n_values);
-// }
-
- memcpy(&codec_id, block->block_contents+offset,
- sizeof(codec_id));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &codec_id) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(codec_id);
-
- if(codec_id != TRG_UNCOMPRESSED)
- {
- memcpy(&multiplier, block->block_contents+offset,
- sizeof(multiplier));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, (int64_t *)&multiplier) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(multiplier);
- }
- else
- {
- multiplier = 1;
- }
-
- if(dependency & TRG_FRAME_DEPENDENT)
- {
- if(sparse_data)
- {
- memcpy(&first_frame_with_data, block->block_contents+offset,
- sizeof(first_frame_with_data));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &first_frame_with_data) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(first_frame_with_data);
-
- memcpy(&steps_between_data, block->block_contents+offset,
- sizeof(steps_between_data));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &steps_between_data) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(steps_between_data);
- }
- else
- {
- first_frame_with_data = 0;
- steps_between_data = 0;
- }
- n_frames = trg_data->current_trajectory_frame_set.n_frames;
- }
- else
- {
- first_frame_with_data = 0;
- steps_between_data = 0;
- n_frames = 0;
- }
-
- if (dependency & TRG_PARTICLE_DEPENDENT)
- {
- memcpy(&first_particle_number, block->block_contents+offset,
- sizeof(first_particle_number));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &first_particle_number) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(first_particle_number);
-
- memcpy(&block_n_particles, block->block_contents+offset,
- sizeof(block_n_particles));
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &block_n_particles) !=
- TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
- offset += sizeof(block_n_particles);
- }
-
- if (dependency & TRG_PARTICLE_DEPENDENT)
- {
- return(trg_read_particle_data(trg_data, block,
- &offset, datatype,
- first_particle_number,
- block_n_particles,
- first_frame_with_data,
- steps_between_data,
- n_frames, n_values,
- codec_id, multiplier));
- }
- else
- {
- return(trg_read_data(trg_data, block,
- &offset, datatype,
- first_frame_with_data,
- steps_between_data,
- n_frames, n_values,
- codec_id, multiplier));
- }
-}
-
-static trg_function_status trg_update_md5_hash(struct trg_trajectory *trg_data,
- struct trg_gen_block *block,
- int64_t header_start_pos,
- int64_t contents_start_pos)
-{
- if(block->block_contents)
- {
- free(block->block_contents);
- }
-
- block->block_contents = malloc(block->block_contents_size);
- fseek(trg_data->output_file, contents_start_pos, SEEK_SET);
- if(fread(block->block_contents, block->block_contents_size, 1,
- trg_data->output_file) == 0)
- {
- printf("Cannot read block. %s: %d\n", __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
-
- trg_generate_block_hash(block);
-
- fseek(trg_data->output_file, header_start_pos + 3 * sizeof(int64_t),
- SEEK_SET);
- fwrite(block->hash, TRG_HASH_LEN, 1, trg_data->output_file);
-
- return(TRG_SUCCESS);
-}
-
-
-static trg_function_status trg_update_header_pointers
- (struct trg_trajectory *trg_data)
-{
- struct trg_gen_block block;
- FILE *temp = trg_data->input_file;
- int64_t pos, contents_start_pos;
-
- if(trg_init_output_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- printf("Cannot initialise destination file. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
-
- trg_data->input_file = trg_data->output_file;
-
- trg_init_block(&block);
-
- trg_data->output_file_pos = ftell(trg_data->output_file);
- fseek(trg_data->output_file, 0, SEEK_SET);
-
- if(trg_read_block_header(trg_data, &block) != TRG_SUCCESS)
- {
- printf("Cannot read general info header. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(&block);
- trg_data->input_file = temp;
- return(TRG_CRITICAL);
- }
-
- contents_start_pos = ftell(trg_data->output_file);
-
- fseek(trg_data->output_file, block.block_contents_size - 3 *
- sizeof(int64_t), SEEK_CUR);
-
- trg_data->input_file = temp;
-
-// printf("Updating header\n");
-// printf("%ld: First frame set %ld\n", ftell(trg_data->output_file),
-// trg_data->first_trajectory_frame_set_output_file_pos);
-
- pos = trg_data->first_trajectory_frame_set_output_file_pos;
-
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &pos) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
-
- if(fwrite(&pos, sizeof(int64_t), 1, trg_data->output_file) != 1)
- {
- trg_destroy_block(&block);
- return(TRG_CRITICAL);
- }
-
-// printf("%ld: Last frame set %ld\n", ftell(trg_data->output_file),
-// trg_data->last_trajectory_frame_set_output_file_pos);
-
- pos = trg_data->last_trajectory_frame_set_output_file_pos;
-
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &pos) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
-
- if(fwrite(&pos,
- sizeof(int64_t), 1, trg_data->output_file) != 1)
- {
- trg_destroy_block(&block);
- return(TRG_CRITICAL);
- }
-
- trg_update_md5_hash(trg_data, &block, 0, contents_start_pos);
-
- fseek(trg_data->output_file, trg_data->output_file_pos, SEEK_SET);
-
- trg_destroy_block(&block);
-
- return(TRG_SUCCESS);
-}
-
-static trg_function_status trg_update_frame_set_pointers
- (struct trg_trajectory *trg_data)
-{
- struct trg_gen_block block;
- struct trg_trajectory_frame_set *frame_set;
- FILE *temp = trg_data->input_file;
- int64_t pos, header_start_pos, contents_start_pos;
-
- if(trg_init_output_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- printf("Cannot initialise destination file. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
-
- trg_init_block(&block);
- trg_data->output_file_pos = ftell(trg_data->output_file);
-
- trg_data->input_file = trg_data->output_file;
-
- frame_set = &trg_data->current_trajectory_frame_set;
- if(frame_set->prev_frame_set_file_pos != -1 &&
- frame_set->prev_frame_set_file_pos != 0)
- {
- fseek(trg_data->output_file, frame_set->prev_frame_set_file_pos,
- SEEK_SET);
-
- header_start_pos = frame_set->prev_frame_set_file_pos;
-
- if(trg_read_block_header(trg_data, &block) != TRG_SUCCESS)
- {
- printf("Cannot read frame header. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(&block);
- trg_data->input_file = temp;
- return(TRG_CRITICAL);
- }
-
- contents_start_pos = ftell(trg_data->output_file);
-
- fseek(trg_data->output_file, block.block_contents_size - 4 *
- sizeof(int64_t), SEEK_CUR);
-
-// printf("Updating frame set\n");
-// printf("%ld: Next frame set %ld\n", ftell(trg_data->output_file),
-// trg_data->current_trajectory_frame_set_output_file_pos);
-
- pos = trg_data->current_trajectory_frame_set_output_file_pos;
-
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &pos) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
-
- if(fwrite(&pos, sizeof(int64_t), 1, trg_data->output_file) != 1)
- {
- trg_destroy_block(&block);
- trg_data->input_file = temp;
- return(TRG_CRITICAL);
- }
-
- trg_update_md5_hash(trg_data, &block, header_start_pos,
- contents_start_pos);
-
- fseek(trg_data->output_file, trg_data->output_file_pos, SEEK_SET);
- }
-
- if(frame_set->long_stride_prev_frame_set_file_pos != -1 &&
- frame_set->long_stride_prev_frame_set_file_pos != 0)
- {
- fseek(trg_data->output_file,
- frame_set->long_stride_prev_frame_set_file_pos,
- SEEK_SET);
-
- if(trg_read_block_header(trg_data, &block) != TRG_SUCCESS)
- {
- printf("Cannot read frame header. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(&block);
- trg_data->input_file = temp;
- return(TRG_CRITICAL);
- }
-
- contents_start_pos = ftell(trg_data->output_file);
-
- fseek(trg_data->output_file, block.block_contents_size - 2 *
- sizeof(int64_t), SEEK_CUR);
-
- pos = trg_data->current_trajectory_frame_set_output_file_pos;
-
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data, &pos) != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
-
- if(fwrite(&pos, sizeof(int64_t), 1, trg_data->output_file) != 1)
- {
- trg_destroy_block(&block);
- trg_data->input_file = temp;
- return(TRG_CRITICAL);
- }
-
- trg_update_md5_hash(trg_data, &block,
- frame_set->long_stride_prev_frame_set_file_pos,
- contents_start_pos);
- }
-
- fseek(trg_data->output_file, trg_data->output_file_pos, SEEK_SET);
-
- trg_data->input_file = temp;
- trg_destroy_block(&block);
-
- return(TRG_SUCCESS);
-}
-
-
-trg_function_status trg_set_block_name(struct trg_trajectory *trg_data,
- struct trg_gen_block *block,
- const char *new_name)
-{
- int len;
-
- len = min(strlen(new_name) + 1, TRG_MAX_STR_LEN);
-
- if(block->name && strlen(block->name) < len)
- {
- free(block->name);
- block->name = 0;
- }
- if(!block->name)
- {
- block->name = (char *) malloc(len);
- if(!block->name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- strncpy(block->name, new_name, len);
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_init_block(struct trg_gen_block *block)
-{
-// printf("In trg_init_block\n");
-
- block->id = -1;
-/* block->hash_type = TRG_NO_HASH;
- block->hash_name = 0;*/
- memcpy(block->hash, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", TRG_HASH_LEN);
- block->name = 0;
- block->block_version = TRG_VERSION;
- block->header_contents = 0;
- block->header_contents_size = 0;
- block->block_contents = 0;
- block->block_contents_size = 0;
-
- return(TRG_SUCCESS);
-}
-
-
-trg_function_status trg_destroy_block(struct trg_gen_block *block)
-{
-// printf("Destroying block\n");
-/* if(block->hash_name)
- {
- free(block->hash_name);
- block->hash_name = 0;
- }*/
-/* if(block->hash)
- {
- free(block->hash);
- block->hash = 0;
- }*/
- if(block->name)
- {
- free(block->name);
- block->name = 0;
- }
- if(block->header_contents)
- {
- free(block->header_contents);
- block->header_contents = 0;
- }
- if(block->block_contents)
- {
- free(block->block_contents);
- block->block_contents = 0;
- }
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_set_atom_name(struct trg_trajectory *trg_data,
- struct trg_atom *atom,
- const char *new_name)
-{
- int len;
-
- len = min(strlen(new_name) + 1, TRG_MAX_STR_LEN);
-
- if(atom->name && strlen(atom->name) < len)
- {
- free(atom->name);
- atom->name = 0;
- }
- if(!atom->name)
- {
- atom->name = (char *) malloc(len);
- if(!atom->name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- strncpy(atom->name, new_name, len);
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_set_atom_type(struct trg_trajectory *trg_data,
- struct trg_atom *atom,
- const char *new_type)
-{
- int len;
-
- len = min(strlen(new_type) + 1, TRG_MAX_STR_LEN);
-
- if(atom->atom_type && strlen(atom->atom_type) < len)
- {
- free(atom->atom_type);
- atom->atom_type = 0;
- }
- if(!atom->atom_type)
- {
- atom->atom_type = (char *) malloc(len);
- if(!atom->atom_type)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- strncpy(atom->atom_type, new_type, len);
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_init_atom(struct trg_atom *atom)
-{
- atom->name = 0;
- atom->atom_type = 0;
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_destroy_atom(struct trg_atom *atom)
-{
- if(atom->name)
- {
- free(atom->name);
- atom->name = 0;
- }
- if(atom->atom_type)
- {
- free(atom->atom_type);
- atom->atom_type = 0;
- }
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_add_molecule(struct trg_trajectory *trg_data,
- const char *name,
- struct trg_molecule **molecule)
-{
- struct trg_molecule *new_molecules;
- int64_t *new_molecule_cnt_list;
- int id, i;
- trg_bool found_id = TRUE;
-
- new_molecules = (struct trg_molecule *)realloc(trg_data->molecules,
- sizeof(struct trg_molecule) *
- (trg_data->n_molecules + 1));
-
- if(!new_molecules)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- sizeof(struct trg_molecule) * (trg_data->n_molecules + 1),
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
-
- new_molecule_cnt_list = (int64_t *) realloc(trg_data->molecule_cnt_list,
- sizeof(int64_t) *
- (trg_data->n_molecules + 1));
-
- if(!new_molecules)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- sizeof(int64_t) * (trg_data->n_molecules + 1),
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
-
- trg_data->molecules = new_molecules;
- trg_data->molecule_cnt_list = new_molecule_cnt_list;
-
- *molecule = &new_molecules[trg_data->n_molecules];
-
- trg_init_molecule(*molecule);
- trg_set_molecule_name(trg_data, *molecule, name);
-
- /* FIXME: Should this be a function argument instead? */
- trg_data->molecule_cnt_list[trg_data->n_molecules] = 0;
-
- /* Find an unused ID */
- id = 0;
- while(found_id)
- {
- found_id = FALSE;
- for(i = trg_data->n_molecules; i--;)
- {
- if(trg_data->molecules[i].id == id)
- {
- found_id = TRUE;
- i = 0;
- }
- }
- if(found_id)
- {
- id++;
- }
- }
-
- (*molecule)->id = id;
-
- trg_data->n_molecules++;
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_set_molecule_name(struct trg_trajectory *trg_data,
- struct trg_molecule *molecule,
- const char *new_name)
-{
- int len;
-
- len = min(strlen(new_name) + 1, TRG_MAX_STR_LEN);
-
- if(molecule->name && strlen(molecule->name) < len)
- {
- free(molecule->name);
- molecule->name = 0;
- }
- if(!molecule->name)
- {
- molecule->name = (char *) malloc(len);
- if(!molecule->name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- strncpy(molecule->name, new_name, len);
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_get_molecule_cnt(struct trg_trajectory *trg_data,
- struct trg_molecule *molecule,
- int64_t *cnt)
-{
- int i, index = -1;
-
- for(i = trg_data->n_molecules; i--;)
- {
- if(&trg_data->molecules[i] == molecule)
- {
- index = i;
- i = 0;
- }
- }
- if(index == -1)
- {
- return(TRG_FAILURE);
- }
- *cnt = trg_data->molecule_cnt_list[index];
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_set_molecule_cnt(struct trg_trajectory *trg_data,
- struct trg_molecule *molecule,
- const int64_t cnt)
-{
- int i, index = -1, old_cnt;
-
- for(i = trg_data->n_molecules; i--;)
- {
- if(&trg_data->molecules[i] == molecule)
- {
- index = i;
- i = 0;
- }
- }
- if(index == -1)
- {
- return(TRG_FAILURE);
- }
- old_cnt = trg_data->molecule_cnt_list[index];
- trg_data->molecule_cnt_list[index] = cnt;
-
- trg_data->n_particles += (cnt-old_cnt) *
- trg_data->molecules[index].n_atoms;
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_add_chain_to_molecule(struct trg_trajectory *trg_data,
- struct trg_molecule *molecule,
- const char *name,
- struct trg_chain **chain)
-{
- struct trg_chain *new_chains;
-
- new_chains = (struct trg_chain *) realloc(molecule->chains,
- sizeof(struct trg_chain) *
- (molecule->n_chains + 1));
-
- if(!new_chains)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- sizeof(struct trg_chain) * (molecule->n_chains + 1),
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
-
- molecule->chains = new_chains;
-
- *chain = &new_chains[molecule->n_chains];
- (*chain)->name = 0;
-
- trg_set_chain_name(trg_data, *chain, name);
-
- (*chain)->molecule = molecule;
- (*chain)->id = molecule->n_chains;
- (*chain)->n_residues = 0;
-
- molecule->n_chains++;
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_set_chain_name(struct trg_trajectory *trg_data,
- struct trg_chain *chain,
- const char *new_name)
-{
- int len;
-
- len = min(strlen(new_name) + 1, TRG_MAX_STR_LEN);
-
- if(chain->name && strlen(chain->name) < len)
- {
- free(chain->name);
- chain->name = 0;
- }
- if(!chain->name)
- {
- chain->name = (char *) malloc(len);
- if(!chain->name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- strncpy(chain->name, new_name, len);
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_add_residue_to_chain(struct trg_trajectory *trg_data,
- struct trg_chain *chain,
- const char *name,
- struct trg_residue **residue)
-{
- int curr_index;
- struct trg_residue *new_residues, *temp_residue, *last_residue;
- struct trg_molecule *molecule = chain->molecule;
-
- if(chain->n_residues)
- {
- curr_index = (chain->residues - molecule->residues) /
- sizeof(struct trg_residue);
- }
- else
- {
- curr_index = -1;
- }
-
- new_residues = (struct trg_residue *) realloc(molecule->residues,
- sizeof(struct trg_residue) *
- (molecule->n_residues + 1));
-
- if(!new_residues)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- sizeof(struct trg_residue) * (molecule->n_residues + 1),
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
-
- molecule->residues = new_residues;
-
- if(curr_index != -1)
- {
- chain->residues = new_residues + curr_index * sizeof(struct trg_residue);
- if(molecule->n_residues)
- {
- last_residue = &new_residues[molecule->n_atoms-1];
-
- temp_residue = chain->residues + (chain->n_residues - 1);
- /* Make space in list of residues to add the new residues together with the other
- * residues of this chain */
- if(temp_residue != last_residue)
- {
- temp_residue++;
- memmove(temp_residue + 1, temp_residue,
- last_residue - temp_residue);
- }
- }
- }
- else
- {
- curr_index = molecule->n_residues;
- }
-
- *residue = &new_residues[curr_index + chain->n_residues];
-
- if(!chain->n_residues)
- {
- chain->residues = *residue;
- }
-
- (*residue)->name = 0;
- trg_set_residue_name(trg_data, *residue, name);
-
- (*residue)->chain = chain;
- (*residue)->id = chain->n_residues;
- (*residue)->n_atoms = 0;
- (*residue)->atoms = 0;
-
- chain->n_residues++;
- molecule->n_residues++;
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_set_residue_name(struct trg_trajectory *trg_data,
- struct trg_residue *residue,
- const char *new_name)
-{
- int len;
-
- len = min(strlen(new_name) + 1, TRG_MAX_STR_LEN);
-
- if(residue->name && strlen(residue->name) < len)
- {
- free(residue->name);
- residue->name = 0;
- }
- if(!residue->name)
- {
- residue->name = (char *) malloc(len);
- if(!residue->name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- strncpy(residue->name, new_name, len);
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_add_atom_to_residue(struct trg_trajectory *trg_data,
- struct trg_residue *residue,
- const char *atom_name,
- const char *atom_type,
- struct trg_atom **atom)
-{
- int curr_index;
- struct trg_atom *new_atoms, *temp_atom, *last_atom;
- struct trg_molecule *molecule = residue->chain->molecule;
-
- if(residue->n_atoms)
- {
- curr_index = (residue->atoms - molecule->atoms) /
- sizeof(struct trg_atom);
- }
- else
- {
- curr_index = -1;
- }
-
- new_atoms = (struct trg_atom *) realloc(molecule->atoms,
- sizeof(struct trg_atom) *
- (molecule->n_atoms + 1));
-
- if(!new_atoms)
- {
- printf("Cannot allocate memory (%"PRId64" bytes). %s: %d\n",
- sizeof(struct trg_atom) * (molecule->n_atoms + 1),
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
-
- molecule->atoms = new_atoms;
-
- if(curr_index != -1)
- {
- residue->atoms = new_atoms + curr_index * sizeof(struct trg_atom);
- if(molecule->n_atoms)
- {
- last_atom = &new_atoms[molecule->n_atoms-1];
-
- temp_atom = residue->atoms + (residue->n_atoms - 1);
- /* Make space in list of atoms to add the new atoms together with the other
- * atoms of this residue */
- if(temp_atom != last_atom)
- {
- temp_atom++;
- memmove(temp_atom + 1, temp_atom,
- last_atom - temp_atom);
- }
- }
- }
- else
- {
- curr_index = molecule->n_atoms;
- }
-
- *atom = &new_atoms[curr_index + residue->n_atoms];
-
- if(!residue->n_atoms)
- {
- residue->atoms = *atom;
- }
-
- trg_init_atom(*atom);
- trg_set_atom_name(trg_data, *atom, atom_name);
- trg_set_atom_type(trg_data, *atom, atom_type);
-
- (*atom)->residue = residue;
- (*atom)->id = molecule->n_atoms;
-
- residue->n_atoms++;
- molecule->n_atoms++;
-
- return(TRG_SUCCESS);
-}
-
-
-trg_function_status trg_init_molecule(struct trg_molecule *molecule)
-{
- molecule->name = 0;
- molecule->n_chains = 0;
- molecule->chains = 0;
- molecule->n_residues = 0;
- molecule->residues = 0;
- molecule->n_atoms = 0;
- molecule->atoms = 0;
- molecule->n_bonds = 0;
- molecule->bonds = 0;
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_destroy_molecule(struct trg_molecule *molecule)
-{
- int i;
-
- if(molecule->name)
- {
- free(molecule->name);
- molecule->name = 0;
- }
-
- if(molecule->chains)
- {
- for(i = molecule->n_chains; i--;)
- {
- if(molecule->chains[i].name)
- {
- free(molecule->chains[i].name);
- molecule->chains[i].name = 0;
- }
- }
- free(molecule->chains);
- molecule->chains = 0;
- }
- molecule->n_chains = 0;
-
- if(molecule->residues)
- {
- for(i = molecule->n_residues; i--;)
- {
- if(molecule->residues[i].name)
- {
- free(molecule->residues[i].name);
- molecule->residues[i].name = 0;
- }
- }
- free(molecule->residues);
- molecule->residues = 0;
- }
- molecule->n_residues = 0;
-
- if(molecule->atoms)
- {
- for(i = molecule->n_atoms; i--;)
- {
- trg_destroy_atom(&molecule->atoms[i]);
- }
- free(molecule->atoms);
- molecule->atoms = 0;
- }
- molecule->n_atoms = 0;
-
- if(molecule->bonds)
- {
- free(molecule->bonds);
- molecule->bonds = 0;
- }
- molecule->n_bonds = 0;
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_init_trajectory(struct trg_trajectory *trg_data)
-{
- time_t seconds;
- struct trg_trajectory_frame_set *frame_set =
- &trg_data->current_trajectory_frame_set;
-
- trg_data->input_file_path = 0;
- trg_data->input_file = 0;
- trg_data->input_file_pos = 0;
- trg_data->input_file_len = 0;
- trg_data->output_file_path = 0;
- trg_data->output_file = 0;
- trg_data->output_file_pos = 0;
-
- trg_data->program_name = 0;
- trg_data->forcefield_name = 0;
-
- /* FIXME: No unistd.h on Windows!! */
-// trg_data->user_name = (char *) malloc(LOGIN_NAME_MAX);
-// if(getlogin_r(trg_data->user_name, LOGIN_NAME_MAX) != 0)
-// {
-// printf("Cannot get user name. %s: %d\n", __FILE__, __LINE__);
-// free(trg_data->user_name);
-// trg_data->user_name = 0;
-// }
- trg_data->user_name = 0;
-
- seconds = time(0);
- if ( seconds == -1)
- {
- printf("Cannot get time. %s: %d\n", __FILE__, __LINE__);
- }
- else
- {
- trg_data->time = seconds;
- }
-
- /* FIXME: No unistd.h on Windows!! */
- /* FIXME: Append operating system to computer_name */
-// trg_data->computer_name = (char *) malloc(HOST_NAME_MAX);
-// if(gethostname(trg_data->computer_name, HOST_NAME_MAX) != 0)
-// {
-// printf("Cannot get computer name. %s: %d\n", __FILE__, __LINE__);
-// free(trg_data->computer_name);
-// trg_data->computer_name = 0;
-// }
- trg_data->computer_name = 0;
-
- trg_data->pgp_signature = 0;
- trg_data->var_num_atoms_flag = TRG_CONSTANT_N_ATOMS;
- trg_data->first_trajectory_frame_set_input_file_pos = -1;
- trg_data->last_trajectory_frame_set_input_file_pos = -1;
- trg_data->current_trajectory_frame_set_input_file_pos = -1;
- trg_data->first_trajectory_frame_set_output_file_pos = -1;
- trg_data->last_trajectory_frame_set_output_file_pos = -1;
- trg_data->current_trajectory_frame_set_output_file_pos = -1;
- trg_data->frame_set_n_frames = 100;
- trg_data->n_trajectory_frame_sets = 0;
- trg_data->n_trajectory_blocks = 0;
- trg_data->stride_length = 100;
-
- trg_data->n_particle_data_blocks = 0;
- trg_data->n_data_blocks = 0;
-
- trg_data->non_tr_particle_data = 0;
- trg_data->non_tr_data = 0;
-
- frame_set->contents.n_blocks = 0;
- frame_set->contents.block_names = 0;
- frame_set->n_mapping_blocks = 0;
- frame_set->mappings = 0;
- frame_set->molecule_cnt_list = 0;
-
- frame_set->n_particle_data_blocks = 0;
- frame_set->n_data_blocks = 0;
-
- frame_set->tr_particle_data = 0;
- frame_set->tr_data = 0;
-
- trg_data->n_molecules = 0;
- trg_data->molecules = 0;
- trg_data->molecule_cnt_list = 0;
- trg_data->n_particles = 0;
-
- trg_data->n_id_name_pairs = 0;
- trg_data->id_name_pairs = 0;
-
- /* Check the endianness of the computer */
- static int32_t endianness_32 = 0x01234567;
- /* 0x01234567 */
- if ( *(const uint8_t*)&endianness_32 == 0x01 )
- {
- trg_data->endianness_32 = TRG_BIG_ENDIAN_32;
- }
-
- /* 0x67452301 */
- else if( *(const uint8_t*)&endianness_32 == 0x67 )
- {
- trg_data->endianness_32 = TRG_LITTLE_ENDIAN_32;
-
- }
-
- /* 0x45670123 */
- else if ( *(const uint8_t*)&endianness_32 == 0x45 )
- {
- trg_data->endianness_32 = TRG_BYTE_PAIR_SWAP_32;
- }
-
- static int64_t endianness_64 = 0x0123456789ABCDEF;
- /* 0x0123456789ABCDEF */
- if ( *(const uint8_t*)&endianness_64 == 0x01 )
- {
- trg_data->endianness_64 = TRG_BIG_ENDIAN_64;
- }
-
- /* 0xEFCDAB8967452301 */
- else if ( *(const uint8_t*)&endianness_64 == 0xEF )
- {
- trg_data->endianness_64 = TRG_LITTLE_ENDIAN_64;
- }
-
- /* 0x89ABCDEF01234567 */
- else if ( *(const uint8_t*)&endianness_64 == 0x89 )
- {
- trg_data->endianness_64 = TRG_QUAD_SWAP_64;
- }
-
- /* 0x45670123CDEF89AB */
- else if ( *(const uint8_t*)&endianness_64 == 0x45 )
- {
- trg_data->endianness_64 = TRG_BYTE_PAIR_SWAP_64;
- }
-
- /* 0x23016745AB89EFCD */
- else if ( *(const uint8_t*)&endianness_64 == 0x23 )
- {
- trg_data->endianness_64 = TRG_BYTE_SWAP_64;
- }
-
-
-
- trg_init_block(&trg_data->non_trajectory_blocks[0]);
- trg_data->non_trajectory_blocks[0].id = TRG_GENERAL_INFO;
- trg_set_block_name(trg_data, &trg_data->non_trajectory_blocks[0],
- "GENERAL INFO");
-
- trg_data->current_trajectory_frame_set.next_frame_set_file_pos = -1;
- trg_data->current_trajectory_frame_set.prev_frame_set_file_pos = -1;
-
- /* The Endianness and String Length block and the Trajectory Info block
- * are present. */
- trg_data->n_non_trajectory_blocks = 1;
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_destroy_trajectory(struct trg_trajectory *trg_data)
-{
- int64_t n_frames, n_particles;
- int i, j, k, l;
- struct trg_trajectory_frame_set *frame_set =
- &trg_data->current_trajectory_frame_set;
-
- struct trg_particle_mapping *mapping;
-
- if(trg_data->input_file_path)
- {
- free(trg_data->input_file_path);
- trg_data->input_file_path = 0;
- }
-
- if(trg_data->input_file)
- {
- fclose(trg_data->input_file);
- trg_data->input_file = 0;
- }
-
- if(trg_data->output_file_path)
- {
- free(trg_data->output_file_path);
- trg_data->output_file_path = 0;
- }
-
- if(trg_data->output_file)
- {
- fclose(trg_data->output_file);
- trg_data->output_file = 0;
- }
-
- if(trg_data->program_name)
- {
- free(trg_data->program_name);
- trg_data->program_name = 0;
- }
-
- if(trg_data->forcefield_name)
- {
- free(trg_data->forcefield_name);
- trg_data->forcefield_name = 0;
- }
-
- if(trg_data->user_name)
- {
- free(trg_data->user_name);
- trg_data->user_name = 0;
- }
-
- if(trg_data->computer_name)
- {
- free(trg_data->computer_name);
- trg_data->computer_name = 0;
- }
-
- if(trg_data->pgp_signature)
- {
- free(trg_data->pgp_signature);
- trg_data->pgp_signature = 0;
- }
-
- if(frame_set->contents.block_names)
- {
- for(i = frame_set->contents.n_blocks; i--;)
- {
- if(frame_set->contents.block_names[i])
- {
- free(frame_set->contents.block_names[i]);
- frame_set->contents.block_names[i] = 0;
- }
- }
- free(frame_set->contents.block_names);
- frame_set->contents.block_names = 0;
- }
-
- for(i = frame_set->n_mapping_blocks; i--;)
- {
- mapping = &frame_set->mappings[i];
- if(mapping->real_particle_numbers)
- {
- free(mapping->real_particle_numbers);
- mapping->real_particle_numbers = 0;
- }
- }
- free(frame_set->mappings);
- frame_set->n_mapping_blocks = 0;
-
- if(frame_set->molecule_cnt_list)
- {
- free(frame_set->molecule_cnt_list);
- frame_set->molecule_cnt_list = 0;
- }
-
- for(i=trg_data->n_non_trajectory_blocks; i--;)
- {
- trg_destroy_block(&trg_data->non_trajectory_blocks[i]);
- }
- trg_data->n_trajectory_blocks = 0;
-
- if(trg_data->var_num_atoms_flag)
- {
- n_particles = trg_data->current_trajectory_frame_set.n_particles;
- }
- else
- {
- n_particles = trg_data->n_particles;
- }
-
- if(trg_data->non_tr_particle_data)
- {
- for(i = trg_data->n_particle_data_blocks; i--; )
- {
- if(trg_data->non_tr_particle_data[i].values)
- {
- /* Only one frame for non-trajectory data */
- j = 0;
- if(trg_data->non_tr_particle_data[i].values[j])
- {
- for(k = n_particles; k--;)
- {
- if(trg_data->non_tr_particle_data[i].values[j][k])
- {
- if(trg_data->non_tr_particle_data[i].datatype ==
- TRG_CHAR_DATA)
- {
- for(l = trg_data->non_tr_particle_data[i].
- n_values_per_frame;
- l--;)
- {
- if(trg_data->non_tr_particle_data[i].
- values[j][k][l].c)
- {
- free(trg_data->non_tr_particle_data[i].
- values[j][k][l].c);
- trg_data->non_tr_particle_data[i].
- values[j][k][l].c = 0;
- }
- }
- }
- free(trg_data->non_tr_particle_data[i].
- values[j][k]);
- trg_data->non_tr_particle_data[i].
- values[j][k] = 0;
- }
- }
- free(trg_data->non_tr_particle_data[i].values[j]);
- trg_data->non_tr_particle_data[i].values[j] = 0;
- }
- free(trg_data->non_tr_particle_data[i].values);
- trg_data->non_tr_particle_data[i].values = 0;
- }
- if(trg_data->non_tr_particle_data[i].block_name)
- {
- free(trg_data->non_tr_particle_data[i].block_name);
- trg_data->non_tr_particle_data[i].block_name = 0;
- }
- }
- free(trg_data->non_tr_particle_data);
- trg_data->non_tr_particle_data = 0;
- }
-
- if(trg_data->non_tr_data)
- {
- for(i = trg_data->n_data_blocks; i--;)
- {
- if(trg_data->non_tr_data[i].values)
- {
- /* Only one frame for non-trajectory data */
- if(trg_data->non_tr_data[i].values[0])
- {
- if(trg_data->non_tr_data[i].datatype ==
- TRG_CHAR_DATA)
- {
- for(k = trg_data->non_tr_data[i].n_values_per_frame;
- k--;)
- {
- if(trg_data->non_tr_data[i].values[0][k].c)
- {
- free(trg_data->non_tr_data[i].values[0][k].c);
- trg_data->non_tr_data[i].values[0][k].c = 0;
- }
- }
- }
- free(trg_data->non_tr_data[i].values[0]);
- trg_data->non_tr_data[i].values[0] = 0;
- }
- free(trg_data->non_tr_data[i].values);
- trg_data->non_tr_data[i].values = 0;
- }
- if(trg_data->non_tr_data[i].block_name)
- {
- free(trg_data->non_tr_data[i].block_name);
- trg_data->non_tr_data[i].block_name = 0;
- }
- }
- free(trg_data->non_tr_data);
- trg_data->non_tr_data = 0;
- }
-
- trg_data->n_particle_data_blocks = 0;
- trg_data->n_data_blocks = 0;
-
- if(frame_set->tr_particle_data)
- {
- for(i = frame_set->n_particle_data_blocks; i--; )
- {
- if(frame_set->tr_particle_data[i].values)
- {
- n_frames = max(1, frame_set->tr_particle_data[i].n_frames);
- for(j = n_frames; j--;)
- {
- if(frame_set->tr_particle_data[i].values[j])
- {
- for(k = n_particles; k--;)
- {
- if(frame_set->tr_particle_data[i].values[j][k])
- {
- if(frame_set->tr_particle_data[i].datatype ==
- TRG_CHAR_DATA)
- {
- for(l = frame_set->tr_particle_data[i].
- n_values_per_frame;
- l--;)
- {
- if(frame_set->tr_particle_data[i].
- values[j][k][l].c)
- {
- free(frame_set->tr_particle_data[i].
- values[j][k][l].c);
-
- frame_set->tr_particle_data[i].
- values[j][k][l].c = 0;
- }
- }
- }
- free(frame_set->tr_particle_data[i].
- values[j][k]);
- frame_set->tr_particle_data[i].values[j][k] = 0;
- }
- }
- free(frame_set->tr_particle_data[i].values[j]);
- frame_set->tr_particle_data[i].values[j] = 0;
- }
- }
- free(frame_set->tr_particle_data[i].values);
- frame_set->tr_particle_data[i].values = 0;
- }
- if(frame_set->tr_particle_data[i].block_name)
- {
- free(frame_set->tr_particle_data[i].block_name);
- frame_set->tr_particle_data[i].block_name = 0;
- }
- }
- free(frame_set->tr_particle_data);
- frame_set->tr_particle_data = 0;
- }
-
- if(frame_set->tr_data)
- {
- for(i = frame_set->n_data_blocks; i--;)
- {
- if(frame_set->tr_data[i].values)
- {
- n_frames = max(1, frame_set->tr_data[i].n_frames);
- for(j = n_frames; j--;)
- {
- if(frame_set->tr_data[i].values[j])
- {
- if(frame_set->tr_data[i].datatype ==
- TRG_CHAR_DATA)
- {
- for(k = frame_set->tr_data[i].n_values_per_frame;
- k--;)
- {
- if(frame_set->tr_data[i].values[j][k].c)
- {
- free(frame_set->tr_data[i].
- values[j][k].c);
-
- frame_set->tr_data[i].
- values[j][k].c = 0;
- }
- }
- }
- free(frame_set->tr_data[i].values[j]);
- frame_set->tr_data[i].values[j] = 0;
- }
- }
- free(frame_set->tr_data[i].values);
- frame_set->tr_data[i].values = 0;
- }
- if(frame_set->tr_data[i].block_name)
- {
- free(frame_set->tr_data[i].block_name);
- frame_set->tr_data[i].block_name = 0;
- }
- }
- free(frame_set->tr_data);
- frame_set->tr_data = 0;
- }
-
- frame_set->n_particle_data_blocks = 0;
- frame_set->n_data_blocks = 0;
-
- if(trg_data->molecules)
- {
- for(i=trg_data->n_molecules; i--;)
- {
- trg_destroy_molecule(&trg_data->molecules[i]);
- }
- free(trg_data->molecules);
- trg_data->molecules = 0;
- trg_data->n_molecules = 0;
- }
- if(trg_data->molecule_cnt_list)
- {
- free(trg_data->molecule_cnt_list);
- trg_data->molecule_cnt_list = 0;
- }
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_set_input_file(struct trg_trajectory *trg_data,
- const char *file_name)
-{
- int len;
- char *temp;
-
- if(trg_data->input_file_path && strcmp(trg_data->input_file_path,
- file_name) == 0)
- {
- return(TRG_SUCCESS);
- }
-
- if(trg_data->input_file)
- {
- fclose(trg_data->input_file);
- }
-
- len = min(strlen(file_name) + 1, TRG_MAX_STR_LEN);
- temp = realloc(trg_data->input_file_path, len);
- if(!temp)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- trg_data->input_file_path = temp;
-
- strncpy(trg_data->input_file_path, file_name, len);
-
- return(trg_init_input_file(trg_data, FALSE));
-}
-
-trg_function_status trg_set_output_file(struct trg_trajectory *trg_data,
- const char *file_name)
-{
- int len;
- char *temp;
-
- if(trg_data->output_file_path &&
- strcmp(trg_data->output_file_path, file_name) == 0)
- {
- return(TRG_SUCCESS);
- }
-
- if(trg_data->output_file)
- {
- fclose(trg_data->output_file);
- }
-
- len = min(strlen(file_name) + 1, TRG_MAX_STR_LEN);
- temp = realloc(trg_data->output_file_path, len);
- if(!temp)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- trg_data->output_file_path = temp;
-
- strncpy(trg_data->output_file_path, file_name, len);
-
- return(trg_init_output_file(trg_data, FALSE));
-}
-
-
-trg_function_status trg_set_program_name(struct trg_trajectory *trg_data,
- const char *new_name)
-{
- int len;
-
- len = min(strlen(new_name) + 1, TRG_MAX_STR_LEN);
-
- if(trg_data->program_name && strlen(trg_data->program_name) < len)
- {
- free(trg_data->program_name);
- trg_data->program_name = 0;
- }
- if(!trg_data->program_name)
- {
- trg_data->program_name = (char *) malloc(len);
- if(!trg_data->program_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- strncpy(trg_data->program_name, new_name, len);
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_set_forcefield_name(struct trg_trajectory *trg_data,
- const char *new_name)
-{
- int len;
-
- len = min(strlen(new_name) + 1, TRG_MAX_STR_LEN);
-
- if(trg_data->forcefield_name && strlen(trg_data->forcefield_name) < len)
- {
- free(trg_data->forcefield_name);
- trg_data->forcefield_name = 0;
- }
- if(!trg_data->forcefield_name)
- {
- trg_data->forcefield_name = (char *) malloc(len);
- if(!trg_data->forcefield_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- strncpy(trg_data->forcefield_name, new_name, len);
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_set_user_name(struct trg_trajectory *trg_data,
- const char *new_name)
-{
- int len;
-
- len = min(strlen(new_name) + 1, TRG_MAX_STR_LEN);
-
- if(trg_data->user_name && strlen(trg_data->user_name) < len)
- {
- free(trg_data->user_name);
- trg_data->user_name = 0;
- }
- if(!trg_data->user_name)
- {
- trg_data->user_name = (char *) malloc(len);
- if(!trg_data->user_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- strncpy(trg_data->user_name, new_name, len);
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_set_computer_name(struct trg_trajectory *trg_data,
- const char *new_name)
-{
- int len;
-
- len = min(strlen(new_name) + 1, TRG_MAX_STR_LEN);
-
- if(trg_data->computer_name && strlen(trg_data->computer_name) < len)
- {
- free(trg_data->computer_name);
- trg_data->computer_name = 0;
- }
- if(!trg_data->computer_name)
- {
- trg_data->computer_name = (char *) malloc(len);
- if(!trg_data->computer_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- strncpy(trg_data->computer_name, new_name, len);
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_set_signature(struct trg_trajectory *trg_data,
- const char *signature)
-{
- int len;
-
- len = min(strlen(signature) + 1, TRG_MAX_STR_LEN);
-
- if(trg_data->pgp_signature && strlen(trg_data->pgp_signature) < len)
- {
- free(trg_data->pgp_signature);
- trg_data->pgp_signature = 0;
- }
- if(!trg_data->pgp_signature)
- {
- trg_data->pgp_signature = (char *) malloc(len);
- if(!trg_data->pgp_signature)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n", len,
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- strncpy(trg_data->pgp_signature, signature, len);
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_read_file_headers(struct trg_trajectory *trg_data,
- trg_close_file_flag close_file)
-{
- int i, cnt = 0, prev_pos = 0;
- struct trg_gen_block *block = trg_data->non_trajectory_blocks;
-
- trg_data->input_file_pos = 0;
-
- if(trg_init_input_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- return(TRG_CRITICAL);
- }
-
- if(!trg_data->input_file_len)
- {
- fseek(trg_data->input_file, 0, SEEK_END);
- trg_data->input_file_len = ftell(trg_data->input_file);
- fseek(trg_data->input_file, 0, SEEK_SET);
- }
-
- for(i = trg_data->n_non_trajectory_blocks; i--;)
- {
- trg_destroy_block(block++);
- }
- trg_data->n_non_trajectory_blocks = 0;
-
- block = trg_data->non_trajectory_blocks;
-
- trg_init_block(block);
- /* Non trajectory blocks (they come before the trajectory
- * blocks in the file) */
- while (prev_pos < trg_data->input_file_len &&
- trg_read_block_header(trg_data, block) != TRG_CRITICAL &&
- block->id != -1 &&
- block->id != TRG_TRAJECTORY_FRAME_SET &&
- trg_data->n_non_trajectory_blocks < 32)
- {
-// printf("Reading block header %d: %s\n", (int)block->id, block->name);
- if(trg_read_next_block(trg_data, block,
- TRG_KEEP_FILE_OPEN) == TRG_SUCCESS)
- {
-// printf("Read block %s\n", block->name);
- block++;
- cnt++;
- trg_data->n_non_trajectory_blocks++;
- if(trg_init_block(block) != TRG_SUCCESS)
- {
- return(TRG_CRITICAL);
- }
- }
- else
- {
- trg_destroy_block(block);
- }
- prev_pos = ftell(trg_data->input_file);
- }
-
- /* Go back if a trajectory block was encountered */
- if(block->id == TRG_TRAJECTORY_FRAME_SET)
- {
- trg_destroy_block(block);
- fseek(trg_data->input_file, prev_pos, SEEK_SET);
- }
-
- if(close_file)
- {
- trg_data->input_file_pos=ftell(trg_data->input_file);
- fclose(trg_data->input_file);
- trg_data->input_file = 0;
- }
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_write_file_headers(struct trg_trajectory *trg_data,
- trg_close_file_flag close_file)
-{
- int i;
- struct trg_gen_block *block, data_block;
-
- trg_data->output_file_pos = 0;
-
- if(trg_init_output_file(trg_data, TRUE) != TRG_SUCCESS)
- {
- return(TRG_CRITICAL);
- }
-
-
- for(i=0; i<trg_data->n_non_trajectory_blocks; ++i)
- {
- block = &trg_data->non_trajectory_blocks[i];
- if(block->id == TRG_GENERAL_INFO)
- {
- if(trg_write_general_info_block(trg_data, block, TRG_NORMAL_WRITE)
- != TRG_SUCCESS)
- {
- printf("Error writing general info block of file %s. %s: %d\n",
- trg_data->input_file_path, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- break;
- }
- }
-
- for(i=0; i<trg_data->n_non_trajectory_blocks; ++i)
- {
- block = &trg_data->non_trajectory_blocks[i];
- if(block->id == TRG_MOLECULES)
- {
- if(trg_write_molecules_block(trg_data, block, TRG_NORMAL_WRITE)
- != TRG_SUCCESS)
- {
- printf("Error writing atom names block of file %s. %s: %d\n",
- trg_data->input_file_path, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- break;
- }
- }
-
- /* FIXME: Currently writing non-trajectory data blocks here.
- * Should perhaps be moved. */
- trg_init_block(&data_block);
- for(i = 0; i < trg_data->n_data_blocks; i++)
- {
- data_block.id = trg_data->non_tr_data[i].block_id;
- trg_write_data_block(trg_data, &data_block,
- i, TRG_NORMAL_WRITE);
- }
-
- for(i = 0; i < trg_data->n_particle_data_blocks; i++)
- {
- data_block.id = trg_data->non_tr_particle_data[i].block_id;
- trg_write_particle_data_block(trg_data, &data_block,
- i, 0, TRG_NORMAL_WRITE);
- }
-
- trg_destroy_block(&data_block);
-
- if(close_file)
- {
- trg_data->output_file_pos=ftell(trg_data->output_file);
- fclose(trg_data->output_file);
- trg_data->output_file = 0;
- }
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_read_next_block(struct trg_trajectory *trg_data,
- struct trg_gen_block *block,
- trg_close_file_flag close_file)
-{
- switch(block->id)
- {
- case TRG_TRAJECTORY_FRAME_SET:
- return(trg_read_frame_set_block(trg_data, block));
- case TRG_BLOCK_TABLE_OF_CONTENTS:
- return(trg_read_trajectory_toc_block(trg_data, block));
- case TRG_PARTICLE_MAPPING:
- return(trg_read_trajectory_mapping_block(trg_data, block));
- case TRG_GENERAL_INFO:
- return(trg_read_general_info_block(trg_data, block));
- case TRG_MOLECULES:
- return(trg_read_molecules_block(trg_data, block));
- default:
- if(block->id >= TRG_TRAJ_BOX_SHAPE)
- {
- return(trg_read_data_block_contents(trg_data, block));
- }
- else
- {
- /* Skip to the next block */
- fseek(trg_data->input_file, block->block_contents_size, SEEK_CUR);
- return(TRG_FAILURE);
- }
- }
-
- /* FIXME: Never reached. */
- if(close_file)
- {
- trg_data->input_file_pos=ftell(trg_data->input_file);
- fclose(trg_data->input_file);
- trg_data->input_file = 0;
- }
-}
-
-// trg_function_status trg_write_block(struct trg_trajectory *trg_data,
-// struct trg_gen_block *block,
-// trg_close_file_flag close_file)
-// {
-// if(trg_data->output_file)
-// {
-// trg_data->output_file_pos = ftell(trg_data->output_file);
-// }
-//
-// switch(block->id)
-// {
-// case TRG_TRAJECTORY_FRAME_SET:
-// return(trg_write_frame_set_block(trg_data, block, TRG_NORMAL_WRITE));
-// break;
-// case TRG_BLOCK_TABLE_OF_CONTENTS:
-// return(trg_write_trajectory_toc_block(trg_data, block,
-// TRG_NORMAL_WRITE));
-// break;
-// case TRG_PARTICLE_MAPPING:
-// return(trg_write_trajectory_mapping_block(trg_data, block,
-// TRG_NORMAL_WRITE));
-// break;
-// case TRG_TRAJ_POSITIONS:
-// break;
-// case TRG_TRAJ_VELOCITIES:
-// break;
-// case TRG_TRAJ_FORCES:
-// break;
-// case TRG_TRAJ_BOX_SHAPE:
-// break;
-// case TRG_GENERAL_INFO:
-// return(trg_write_general_info_block(trg_data, block,
-// TRG_NORMAL_WRITE));
-// case TRG_MOLECULES:
-// return(trg_write_molecules_block(trg_data, block,
-// TRG_NORMAL_WRITE));
-// default:
-// if(block->id > TRG_TRAJ_FORCES)
-// {
-// /* Implement writing data blocks. */
-// return(TRG_FAILURE);
-// }
-// else
-// {
-// return(TRG_FAILURE);
-// }
-// }
-//
-// /* FIXME: Never reached. */
-// if(close_file)
-// {
-// fclose(trg_data->output_file);
-// trg_data->output_file = 0;
-// }
-//
-// return(TRG_SUCCESS);
-// }
-
-trg_function_status trg_read_next_frame_set(struct trg_trajectory *trg_data,
- trg_close_file_flag close_file)
-{
- long int file_pos;
- struct trg_gen_block block;
- trg_function_status stat = TRG_SUCCESS;
-
- if(trg_init_input_file(trg_data, FALSE) != TRG_SUCCESS)
- {
- return(TRG_CRITICAL);
- }
-
- trg_init_block(&block);
-
- file_pos = trg_data->current_trajectory_frame_set.next_frame_set_file_pos;
-
- if(file_pos > 0)
- {
- fseek(trg_data->input_file,
- file_pos,
- SEEK_SET);
- }
- else
- {
- return(TRG_CRITICAL);
- }
-
- if(!trg_data->input_file_len)
- {
- fseek(trg_data->input_file, 0, SEEK_END);
- trg_data->input_file_len = ftell(trg_data->input_file);
- fseek(trg_data->input_file, file_pos, SEEK_SET);
- }
-
- stat = trg_read_block_header(trg_data, &block);
- if(stat == TRG_CRITICAL || block.id != TRG_TRAJECTORY_FRAME_SET)
- {
- return(TRG_CRITICAL);
- }
-
- trg_data->current_trajectory_frame_set_input_file_pos = file_pos;
-
- if(trg_read_next_block(trg_data, &block,
- TRG_KEEP_FILE_OPEN) == TRG_SUCCESS)
- {
- file_pos = ftell(trg_data->input_file);
- /* Read all blocks until next frame set block */
- stat = trg_read_block_header(trg_data, &block);
- while(file_pos < trg_data->input_file_len &&
- stat != TRG_CRITICAL &&
- block.id != TRG_TRAJECTORY_FRAME_SET)
- {
- stat = trg_read_next_block(trg_data, &block,
- TRG_KEEP_FILE_OPEN) == TRG_SUCCESS;
-
- if(stat != TRG_CRITICAL)
- {
- file_pos = ftell(trg_data->input_file);
- if(file_pos < trg_data->input_file_len)
- {
- stat = trg_read_block_header(trg_data, &block);
- }
- }
- }
- if(stat == TRG_CRITICAL)
- {
- return(stat);
- }
-
- if(block.id == TRG_TRAJECTORY_FRAME_SET)
- {
- fseek(trg_data->input_file, file_pos, SEEK_SET);
- }
- }
-
- trg_data->input_file_pos=ftell(trg_data->input_file);
-
- trg_destroy_block(&block);
-
- if(close_file)
- {
- fclose(trg_data->input_file);
- trg_data->input_file = 0;
- }
-
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_write_frame_set(struct trg_trajectory *trg_data,
- trg_close_file_flag close_file)
-{
- int i, j;
- struct trg_gen_block block;
- struct trg_trajectory_frame_set *frame_set =
- &trg_data->current_trajectory_frame_set;
-
- trg_function_status stat;
-
-
- if(trg_data->output_file)
- {
- trg_data->current_trajectory_frame_set_output_file_pos =
- ftell(trg_data->output_file);
- }
- else
- {
- trg_data->current_trajectory_frame_set_output_file_pos =
- trg_data->output_file_pos;
- }
-
- trg_init_block(&block);
- block.id = TRG_TRAJECTORY_FRAME_SET;
-
- trg_write_frame_set_block(trg_data, &block, TRG_NORMAL_WRITE);
-
- if(frame_set->contents.n_blocks > 0)
- {
- block.id = TRG_BLOCK_TABLE_OF_CONTENTS;
- trg_write_trajectory_toc_block(trg_data, &block, TRG_NORMAL_WRITE);
- }
- for(i = 0; i<frame_set->n_data_blocks; i++)
- {
- block.id = frame_set->tr_data[i].block_id;
- trg_write_data_block(trg_data, &block, i, TRG_NORMAL_WRITE);
- }
- if(frame_set->n_mapping_blocks)
- {
- for(i = 0; i < frame_set->n_mapping_blocks; i++)
- {
- block.id = TRG_PARTICLE_MAPPING;
- if(frame_set->mappings[i].n_particles > 0)
- {
- trg_write_trajectory_mapping_block(trg_data, &block, i,
- TRG_NORMAL_WRITE);
- for(j = 0; j<frame_set->n_particle_data_blocks; j++)
- {
- block.id = frame_set->tr_particle_data[i].block_id;
- trg_write_particle_data_block(trg_data, &block,
- j, &frame_set->mappings[i],
- TRG_NORMAL_WRITE);
- }
- }
- }
- }
- else
- {
- for(i = 0; i<frame_set->n_particle_data_blocks; i++)
- {
- block.id = frame_set->tr_particle_data[i].block_id;
- trg_write_particle_data_block(trg_data, &block,
- i, 0, TRG_NORMAL_WRITE);
- }
- }
-
- trg_data->output_file_pos = ftell(trg_data->output_file);
-
- stat = trg_update_header_pointers(trg_data);
-
- if(stat == TRG_SUCCESS)
- {
- stat = trg_update_frame_set_pointers(trg_data);
- }
-
- trg_destroy_block(&block);
-
- if(close_file)
- {
- fclose(trg_data->input_file);
- trg_data->input_file = 0;
- }
-
- return(stat);
-}
-
-trg_function_status trg_new_frame_set(struct trg_trajectory *trg_data,
- const int64_t first_frame,
- const int64_t n_frames)
-{
- int i;
- struct trg_gen_block block;
- struct trg_trajectory_frame_set *frame_set;
- struct trg_particle_mapping *mapping;
- FILE *temp = trg_data->input_file;
- int64_t curr_pos;
-
- frame_set = &trg_data->current_trajectory_frame_set;
-
- if(trg_data->n_trajectory_frame_sets)
- {
- frame_set->prev_frame_set_file_pos =
- trg_data->current_trajectory_frame_set_output_file_pos;
- }
-
- if(trg_data->output_file)
- {
- trg_data->current_trajectory_frame_set_output_file_pos =
- ftell(trg_data->output_file);
- }
- else
- {
- trg_data->current_trajectory_frame_set_output_file_pos =
- trg_data->output_file_pos;
- }
-
- if(frame_set->n_mapping_blocks && frame_set->mappings)
- {
- for(i = frame_set->n_mapping_blocks; i--;)
- {
- mapping = &frame_set->mappings[i];
- if(mapping->real_particle_numbers)
- {
- free(mapping->real_particle_numbers);
- mapping->real_particle_numbers = 0;
- }
- }
- free(frame_set->mappings);
- frame_set->n_mapping_blocks = 0;
- }
-
- trg_data->n_trajectory_frame_sets++;
-
- /* Set the long range pointers */
- if(trg_data->n_trajectory_frame_sets == trg_data->stride_length + 1)
- {
- frame_set->long_stride_prev_frame_set_file_pos =
- trg_data->first_trajectory_frame_set_output_file_pos;
- }
- else if(trg_data->n_trajectory_frame_sets > trg_data->stride_length + 1)
- {
- /* FIXME: Currently only working if the previous frame set has its
- * long stride pointer already set. This might need some fixing. */
- if(frame_set->long_stride_prev_frame_set_file_pos != -1 &&
- frame_set->long_stride_prev_frame_set_file_pos != 0)
- {
- trg_init_block(&block);
- trg_data->input_file = trg_data->output_file;
-
- curr_pos = ftell(trg_data->output_file);
- fseek(trg_data->output_file,
- frame_set->long_stride_prev_frame_set_file_pos,
- SEEK_SET);
-
- if(trg_read_block_header(trg_data, &block) != TRG_SUCCESS)
- {
- printf("Cannot read frame header. %s: %d\n",
- __FILE__, __LINE__);
- trg_destroy_block(&block);
- trg_data->input_file = temp;
- return(TRG_CRITICAL);
- }
-
- /* Read the next frame set from the previous frame set and one
- * long stride step back */
- fseek(trg_data->output_file, block.block_contents_size - 4 *
- sizeof(int64_t), SEEK_CUR);
- if(fread(&frame_set->long_stride_prev_frame_set_file_pos,
- sizeof(frame_set->long_stride_prev_frame_set_file_pos),
- 1, trg_data->output_file) == 0)
- {
- printf("Cannot read block. %s: %d\n", __FILE__, __LINE__);
- trg_destroy_block(&block);
- trg_data->input_file = temp;
- return(TRG_CRITICAL);
- }
-
- if(trg_data->endianness_64 != TRG_BIG_ENDIAN_64)
- {
- if(trg_swap_byte_order_64(trg_data,
- &frame_set->
- long_stride_prev_frame_set_file_pos)
- != TRG_SUCCESS)
- {
- printf("Cannot swap byte order to get big endian. %s: %d\n",
- __FILE__, __LINE__);
- }
- }
-
- trg_destroy_block(&block);
- trg_data->input_file = temp;
- fseek(trg_data->output_file, curr_pos, SEEK_SET);
- }
- }
-
- frame_set->first_frame = first_frame;
- frame_set->n_frames = n_frames;
-// frame_set->n_particle_data_blocks = 0;
-// frame_set->n_data_blocks = 0;
-
- if(trg_data->first_trajectory_frame_set_output_file_pos == -1 ||
- trg_data->first_trajectory_frame_set_output_file_pos == 0)
- {
- trg_data->first_trajectory_frame_set_output_file_pos =
- trg_data->current_trajectory_frame_set_output_file_pos;
- }
- /* FIXME: Should check the frame number instead of the file_pos,
- * in case frame sets are not in order */
- if(trg_data->last_trajectory_frame_set_output_file_pos == -1 ||
- trg_data->last_trajectory_frame_set_output_file_pos == 0 ||
- trg_data->last_trajectory_frame_set_output_file_pos <
- trg_data->current_trajectory_frame_set_output_file_pos)
- {
- trg_data->last_trajectory_frame_set_output_file_pos =
- trg_data->current_trajectory_frame_set_output_file_pos;
- }
-
- return(TRG_SUCCESS);
-}
-
-/* UNTESTED */
-trg_function_status trg_add_data_block(struct trg_trajectory *trg_data,
- const int64_t id,
- const char *block_name,
- const char datatype,
- const int64_t n_frames,
- const int64_t n_values_per_frame,
- const int64_t stride_length,
- int64_t codec_id,
- void *new_data)
-{
- int i, j, block_index, size, len;
- struct trg_trajectory_frame_set *frame_set;
- struct trg_data *data;
- void *orig;
- trg_block_type block_type_flag;
-
- frame_set = &trg_data->current_trajectory_frame_set;
-
- if(trg_data->current_trajectory_frame_set_output_file_pos > 0)
- {
- block_type_flag = TRG_TRAJECTORY_BLOCK;
- }
- else
- {
- block_type_flag = TRG_NON_TRAJECTORY_BLOCK;
- }
-
- block_index = -1;
- /* See if there is already a data block of this ID */
- if(block_type_flag == TRG_TRAJECTORY_BLOCK)
- {
- for(i = frame_set->n_data_blocks; i-- ;)
- {
- data = &frame_set->tr_data[i];
- if(data->block_id == id)
- {
- block_index = i;
- break;
- }
- }
- }
- else
- {
- for(i = trg_data->n_data_blocks; i-- ;)
- {
- data = &trg_data->non_tr_data[i];
- if(data->block_id == id)
- {
- block_index = i;
- break;
- }
- }
- }
-
- /* Otherwise create a data block */
- if(block_index == -1)
- {
- if(trg_create_data_block(trg_data, block_type_flag) !=
- TRG_SUCCESS)
- {
- printf("Cannot create data block. %s: %d\n", __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- if(block_type_flag == TRG_TRAJECTORY_BLOCK)
- {
- data = &frame_set->tr_data[frame_set->n_data_blocks - 1];
- }
- else
- {
- data = &trg_data->non_tr_data[trg_data->n_data_blocks - 1];
- }
- data->block_id = id;
-
- data->block_name = malloc(strlen(block_name) + 1);
- if(!data->block_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n",
- (int)strlen(block_name)+1, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- strncpy(data->block_name, block_name, strlen(block_name) + 1);
-
- data->datatype = datatype;
-
- data->stride_length = 1;
- data->values = 0;
- data->n_values_per_frame = 0;
- data->n_frames = 0;
- data->codec_id = codec_id;
- }
-
- /* Allocate memory */
- if(!data->values || data->n_frames != n_frames ||
- data->n_values_per_frame != n_values_per_frame)
- {
- if(trg_allocate_data_mem(trg_data, data, n_frames,
- n_values_per_frame) !=
- TRG_SUCCESS)
- {
- printf("Cannot allocate data memory. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- switch(datatype)
- {
- case TRG_FLOAT_DATA:
- size = sizeof(float);
- break;
- case TRG_INT_DATA:
- size = sizeof(int64_t);
- break;
- case TRG_CHAR_DATA:
- size = sizeof(char);
- case TRG_DOUBLE_DATA:
- default:
- size = sizeof(double);
- break;
- }
-
- orig = new_data;
-
- for(i = 0; i < n_frames; i++)
- {
- for(j = 0; j < n_values_per_frame; j++)
- {
- /* FIXME: Not optimal to have this switch statement inside
- * the for loops. Check if it should be moved outside. */
- switch(datatype)
- {
- case TRG_CHAR_DATA:
- len = min(strlen(new_data) + 1,
- TRG_MAX_STR_LEN);
- if(data->values[i][j].c)
- {
- free(data->values[i][j].c);
- }
- data->values[i][j].c = malloc(len);
- if(!data->values[i][j].c)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n",
- len, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- strncpy(data->values[i][j].c,
- new_data, len);
- new_data += len;
- break;
- case TRG_INT_DATA:
- memcpy(&data->values[i][j].i,
- new_data, size);
- new_data += size;
- break;
- case TRG_FLOAT_DATA:
- memcpy(&data->values[i][j].f,
- new_data, size);
- new_data += size;
- break;
- case TRG_DOUBLE_DATA:
- default:
- memcpy(&data->values[i][j].d,
- new_data, size);
- new_data += size;
- }
- }
- }
-
- new_data = orig;
-
- return(TRG_SUCCESS);
-}
-
-
-trg_function_status trg_add_particle_data_block(struct trg_trajectory *trg_data,
- const int64_t id,
- const char *block_name,
- const char datatype,
- const int64_t n_frames,
- const int64_t n_values_per_frame,
- const int64_t stride_length,
- const int64_t first_particle_number,
- const int64_t n_particles,
- int64_t codec_id,
- void *new_data)
-{
- int i, j, k, block_index, size, len;
- int64_t tot_n_particles;
- struct trg_trajectory_frame_set *frame_set;
- struct trg_particle_data *data;
- void *orig;
- trg_block_type block_type_flag;
-
- frame_set = &trg_data->current_trajectory_frame_set;
-
- if(trg_data->current_trajectory_frame_set_output_file_pos > 0)
- {
- block_type_flag = TRG_TRAJECTORY_BLOCK;
- }
- else
- {
- block_type_flag = TRG_NON_TRAJECTORY_BLOCK;
- }
-
- block_index = -1;
- /* See if there is already a data block of this ID */
- if(block_type_flag == TRG_TRAJECTORY_BLOCK)
- {
- for(i = frame_set->n_particle_data_blocks; i-- ;)
- {
- data = &frame_set->tr_particle_data[i];
- if(data->block_id == id)
- {
- block_index = i;
- break;
- }
- }
- }
- else
- {
- for(i = trg_data->n_particle_data_blocks; i-- ;)
- {
- data = &trg_data->non_tr_particle_data[i];
- if(data->block_id == id)
- {
- block_index = i;
- break;
- }
- }
- }
-
- /* Otherwise create a data block */
- if(block_index == -1)
- {
- if(trg_create_particle_data_block(trg_data, block_type_flag) !=
- TRG_SUCCESS)
- {
- printf("Cannot create particle data block. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- if(block_type_flag == TRG_TRAJECTORY_BLOCK)
- {
- data = &frame_set->tr_particle_data[frame_set->
- n_particle_data_blocks - 1];
- }
- else
- {
- data = &trg_data->non_tr_particle_data[trg_data->
- n_particle_data_blocks - 1];
- }
- data->block_id = id;
-
- data->block_name = malloc(strlen(block_name) + 1);
- if(!data->block_name)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n",
- (int)strlen(block_name)+1, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- strncpy(data->block_name, block_name, strlen(block_name) + 1);
-
- data->datatype = datatype;
-
- data->stride_length = 1;
- data->values = 0;
- data->n_values_per_frame = 0;
- data->n_frames = 0;
- data->codec_id = codec_id;
- }
-
- if(block_type_flag == TRG_TRAJECTORY_BLOCK && trg_data->var_num_atoms_flag)
- {
- tot_n_particles = frame_set->n_particles;
- }
- else
- {
- tot_n_particles = trg_data->n_particles;
- }
-
- /* Allocate memory */
- if(!data->values || data->n_frames != n_frames ||
- data->n_values_per_frame != n_values_per_frame)
- {
- if(trg_allocate_particle_data_mem(trg_data, data, n_frames,
- tot_n_particles,
- n_values_per_frame) !=
- TRG_SUCCESS)
- {
- printf("Cannot allocate particle data memory. %s: %d\n",
- __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- }
-
- switch(datatype)
- {
- case TRG_FLOAT_DATA:
- size = sizeof(float);
- break;
- case TRG_INT_DATA:
- size = sizeof(int64_t);
- break;
- case TRG_CHAR_DATA:
- size = sizeof(char);
- case TRG_DOUBLE_DATA:
- default:
- size = sizeof(double);
- break;
- }
-
- orig = new_data;
-
- for(i = 0; i < n_frames; i++)
- {
- for(j = first_particle_number; j < n_particles; j++)
- {
- for(k = 0; k < n_values_per_frame; k++)
- {
- /* FIXME: Not optimal to have this switch statement inside
- * the for loops. Check if it should be moved outside. */
- switch(datatype)
- {
- case TRG_CHAR_DATA:
- len = min(strlen(new_data) + 1,
- TRG_MAX_STR_LEN);
- if(data->values[i][j][k].c)
- {
- free(data->values[i][j][k].c);
- }
- data->values[i][j][k].c = malloc(len);
- if(!data->values[i][j][k].c)
- {
- printf("Cannot allocate memory (%d bytes). %s: %d\n",
- len, __FILE__, __LINE__);
- return(TRG_CRITICAL);
- }
- strncpy(data->values[i][j][k].c,
- new_data, len);
- new_data += len;
- break;
- case TRG_INT_DATA:
- memcpy(&data->values[i][j][k].i,
- new_data, size);
- new_data += size;
- break;
- case TRG_FLOAT_DATA:
- memcpy(&data->values[i][j][k].f,
- new_data, size);
- new_data += size;
- break;
- case TRG_DOUBLE_DATA:
- default:
- memcpy(&data->values[i][j][k].d,
- new_data, size);
- new_data += size;
- }
- }
- }
- }
-
- new_data = orig;
-
- return(TRG_SUCCESS);
-}
-
-
-trg_function_status trg_read_next_traj_block(struct trg_trajectory *trg_data,
- trg_close_file_flag close_file)
-{
- /* STUB */
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_write_next_traj_block(struct trg_trajectory *trg_data,
- trg_close_file_flag close_file)
-{
- /* STUB */
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_read_traj_block(struct trg_trajectory *trg_data,
- int64_t block_id,
- trg_close_file_flag close_file)
-{
- /* STUB */
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_write_traj_block(struct trg_trajectory *trg_data,
- int64_t block_id,
- trg_close_file_flag close_file)
-{
- /* STUB */
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_read_frame_nr(struct trg_trajectory *trg_data,
- int64_t frame_nr,
- trg_close_file_flag close_file)
-{
- /* STUB */
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_write_frame_nr(struct trg_trajectory *trg_data,
- int64_t frame_nr,
- trg_close_file_flag close_file)
-{
- /* STUB */
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_read_frame_nrs(struct trg_trajectory *trg_data,
- int64_t start_frame_nr,
- int64_t end_frame_nr,
- trg_close_file_flag close_file)
-{
- /* STUB */
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_write_frame_nrs(struct trg_trajectory *trg_data,
- int64_t start_frame_nr,
- int64_t end_frame_nr,
- trg_close_file_flag close_file)
-{
- /* STUB */
- return(TRG_SUCCESS);
-}
-
-trg_function_status trg_read_frame_set_nr(struct trg_trajectory *trg_data,
- int64_t frame_set_nr)
-{
- return(TRG_SUCCESS);
-}
-
-
-trg_function_status trg_get_time_str(struct trg_trajectory *trg_data,
- char *time)
-{
- struct tm *time_data;
- time_t secs;
-
- secs = trg_data->time;
-
- time_data = localtime(&secs); // Returns a statically allocated variable.
- snprintf(time, TRG_MAX_DATE_STR_LEN,
- "%4d-%02d-%02d %02d:%02d:%02d",
- time_data->tm_year+1900, time_data->tm_mon+1, time_data->tm_mday,
- time_data->tm_hour, time_data->tm_min, time_data->tm_sec);
-
- return(TRG_SUCCESS);
-}
-
contact: Jan Huwald // Impressum