diff options
Diffstat (limited to 'src/compression/xtc2.c')
-rw-r--r-- | src/compression/xtc2.c | 120 |
1 files changed, 72 insertions, 48 deletions
diff --git a/src/compression/xtc2.c b/src/compression/xtc2.c index bbd45e9..e5b688a 100644 --- a/src/compression/xtc2.c +++ b/src/compression/xtc2.c @@ -1,7 +1,7 @@ /* This code is part of the tng compression routines. * - * Written by Daniel Spangberg - * Copyright (c) 2010, 2013, The GROMACS development team. + * Written by Daniel Spangberg and Magnus Lundborg + * Copyright (c) 2010, 2013-2014 The GROMACS development team. * * * This program is free software; you can redistribute it and/or @@ -26,6 +26,12 @@ /* Generated by gen_magic.py */ #define MAX_MAGIC 92 +#ifdef USE_WINDOWS +#define TNG_INLINE __inline +#else +#define TNG_INLINE inline +#endif + static unsigned int magic[MAX_MAGIC]={ 2U, 3U, 4U, 5U, 6U, 8U, 10U, 12U, @@ -159,20 +165,43 @@ static const double iflipgaincheck=0.89089871814033927; /* 1./(2**(1./6)) */ #define SHOWIT #endif +#ifdef USE_WINDOWS +#define TNG_INLINE __inline +#else +#define TNG_INLINE inline +#endif + int Ptngc_magic(unsigned int i) { return magic[i]; } -int Ptngc_find_magic_index(unsigned int maxval) +TNG_INLINE int Ptngc_find_magic_index(const unsigned int maxval) { - int i=0; + int i; + + if(maxval > magic[MAX_MAGIC/4]) + { + if(maxval > magic[MAX_MAGIC/2]) + { + i = MAX_MAGIC/2 + 1; + } + else + { + i = MAX_MAGIC/4 + 1; + } + } + else + { + i = 0; + } + while (magic[i]<=maxval) i++; return i; } -static unsigned int positive_int(int item) +TNG_INLINE static unsigned int positive_int(const int item) { int s=0; if (item>0) @@ -182,7 +211,7 @@ static unsigned int positive_int(int item) return s; } -static int unpositive_int(int val) +TNG_INLINE static int unpositive_int(const int val) { int s=(val+1)/2; if ((val%2)==0) @@ -438,23 +467,26 @@ static int compute_magic_bits(int *index) /* Convert a sequence of (hopefully) small positive integers using the base pointed to by index (x base, y base and z base can be different). The largest number of integers supported is 18 (29 to handle/detect overflow) */ -static void trajcoder_base_compress(int *input, int n, int *index, unsigned char *result) +static void trajcoder_base_compress(int *input, const int n, int *index, unsigned char *result) { unsigned int largeint[19]; unsigned int largeint_tmp[19]; - int i,j; - for (i=0; i<19; i++) - largeint[i]=0U; + int i, j; + + memset(largeint, 0U, sizeof(unsigned int) * 19); - for (i=0; i<n; i++) + if(n > 0) { - if (i!=0) - { - /* We must do the multiplication of the largeint with the integer base */ - Ptngc_largeint_mul(magic[index[i%3]],largeint,largeint_tmp,19); - for (j=0; j<19; j++) - largeint[j]=largeint_tmp[j]; - } + Ptngc_largeint_add(input[0],largeint,19); + } + + for (i=1; i<n; i++) + { + /* We must do the multiplication of the largeint with the integer base */ + Ptngc_largeint_mul(magic[index[i%3]],largeint,largeint_tmp,19); + + memcpy(largeint,largeint_tmp,19*sizeof *largeint); + Ptngc_largeint_add(input[i],largeint,19); } if (largeint[18]) @@ -481,7 +513,7 @@ static void trajcoder_base_compress(int *input, int n, int *index, unsigned char } /* The opposite of base_compress. */ -static void trajcoder_base_decompress(unsigned char *input, int n, int *index, int *output) +static void trajcoder_base_decompress(unsigned char *input, const int n, int *index, int *output) { unsigned int largeint[19]; unsigned int largeint_tmp[19]; @@ -524,7 +556,7 @@ static void trajcoder_base_decompress(unsigned char *input, int n, int *index, i /* It is "large" if we have to increase the small index quite a bit. Not so much to be rejected by the not very large check later. */ -static int is_quite_large(int *input, int small_index, int max_large_index) +static int is_quite_large(int *input, const int small_index, const int max_large_index) { int is=0; int i; @@ -547,7 +579,7 @@ int nbits_sum; int nvalues_sum; #endif -static void write_three_large(struct coder *coder, int *encode_ints, int *large_index, int nbits, unsigned char *compress_buffer, unsigned char **output_ptr) +static void write_three_large(struct coder *coder, int *encode_ints, int *large_index, const int nbits, unsigned char *compress_buffer, unsigned char **output_ptr) { trajcoder_base_compress(encode_ints,3,large_index,compress_buffer); Ptngc_writemanybits(coder,compress_buffer,nbits,output_ptr); @@ -559,7 +591,7 @@ static void write_three_large(struct coder *coder, int *encode_ints, int *large_ #endif } -static void insert_batch(int *input_ptr, int ntriplets_left, int *prevcoord,int *minint, int *encode_ints, int startenc, int *nenc) +static void insert_batch(int *input_ptr, int ntriplets_left, const int *prevcoord,int *minint, int *encode_ints, const int startenc, int *nenc) { int nencode=startenc*3; int tmp_prevcoord[3]; @@ -617,8 +649,8 @@ static void insert_batch(int *input_ptr, int ntriplets_left, int *prevcoord,int *nenc=nencode; } -static void flush_large(struct coder *coder, int *has_large, int *has_large_ints, int n, - int *large_index, int large_nbits, unsigned char *compress_buffer, +static void flush_large(struct coder *coder, int *has_large, int *has_large_ints, const int n, + int *large_index, const int large_nbits, unsigned char *compress_buffer, unsigned char **output_ptr) { int i; @@ -651,7 +683,7 @@ static void flush_large(struct coder *coder, int *has_large, int *has_large_ints } static void buffer_large(struct coder *coder, int *has_large, int *has_large_ints, int *new_large_ints, - int *large_index, int large_nbits, unsigned char *compress_buffer, + int *large_index, const int large_nbits, unsigned char *compress_buffer, unsigned char **output_ptr) { /* If it is full we must write them all. */ @@ -669,7 +701,7 @@ unsigned char *Ptngc_pack_array_xtc2(struct coder *coder,int *input, int *length { unsigned char *output=NULL; unsigned char *output_ptr=NULL; - int i,ienc,j; + int i,ienc,j,imult; int output_length=0; /* Pack triplets. */ int ntriplets=*length/3; @@ -709,13 +741,15 @@ unsigned char *Ptngc_pack_array_xtc2(struct coder *coder,int *input, int *length maxint[2]=minint[2]=input[2]; for (i=1; i<ntriplets; i++) - for (j=0; j<3; j++) - { - if (input[i*3+j]>maxint[j]) - maxint[j]=input[i*3+j]; - if (input[i*3+j]<minint[j]) - minint[j]=input[i*3+j]; - } + { + for (j=0; j<3; j++) + { + if (input[i*3+j]>maxint[j]) + maxint[j]=input[i*3+j]; + if (input[i*3+j]<minint[j]) + minint[j]=input[i*3+j]; + } + } large_index[0]=Ptngc_find_magic_index(maxint[0]-minint[0]+1); large_index[1]=Ptngc_find_magic_index(maxint[1]-minint[1]+1); @@ -794,9 +828,7 @@ unsigned char *Ptngc_pack_array_xtc2(struct coder *coder,int *input, int *length #endif /* Initial prevcoord is the minimum integers. */ - prevcoord[0]=minint[0]; - prevcoord[1]=minint[1]; - prevcoord[2]=minint[2]; + memcpy(prevcoord, minint, 3*sizeof *prevcoord); while (ntriplets_left) { @@ -1304,9 +1336,7 @@ int Ptngc_unpack_array_xtc2(struct coder *coder,unsigned char *packed,int *outpu #endif /* Initial prevcoord is the minimum integers. */ - prevcoord[0]=minint[0]; - prevcoord[1]=minint[1]; - prevcoord[2]=minint[2]; + memcpy(prevcoord, minint, 3*sizeof *prevcoord); while (ntriplets_left) { @@ -1329,9 +1359,7 @@ int Ptngc_unpack_array_xtc2(struct coder *coder,unsigned char *packed,int *outpu /* Get the large value. */ readmanybits(&ptr,&bitptr,large_nbits,compress_buffer); trajcoder_base_decompress(compress_buffer,3,large_index,encode_ints); - large_ints[0]=encode_ints[0]; - large_ints[1]=encode_ints[1]; - large_ints[2]=encode_ints[2]; + memcpy(large_ints, encode_ints, 3*sizeof *large_ints); #ifdef SHOWIT fprintf(stderr,"large ints: %d %d %d\n",large_ints[0],large_ints[1],large_ints[2]); #endif @@ -1444,16 +1472,12 @@ int Ptngc_unpack_array_xtc2(struct coder *coder,unsigned char *packed,int *outpu /* Get the large value. */ readmanybits(&ptr,&bitptr,large_nbits,compress_buffer); trajcoder_base_decompress(compress_buffer,3,large_index,encode_ints); - large_ints[0]=encode_ints[0]; - large_ints[1]=encode_ints[1]; - large_ints[2]=encode_ints[2]; + memcpy(large_ints, encode_ints, 3*sizeof *large_ints); /* Output large value */ *output++=large_ints[0]+minint[0]; *output++=large_ints[1]+minint[1]; *output++=large_ints[2]+minint[2]; - prevcoord[0]=large_ints[0]; - prevcoord[1]=large_ints[1]; - prevcoord[2]=large_ints[2]; + memcpy(prevcoord, large_ints, 3*sizeof *prevcoord); } ntriplets_left-=n; } |