Trisurf Monte Carlo simulator
b8fc1a87ddbf138e1a710fbc3c164219f30799fd..80ebbe388f3e945e62f47b0141c660ee6f05c8fc
2019-10-17 Samo Penic
have some kind of memory allocation error :(
80ebbe diff | tree
2019-10-17 Samo Penic
Non debugged compression of integer fields
aecb11 diff | tree
3 files modified
60 ■■■■ changed files
src/io.c 19 ●●●● patch | view | raw | blame | history
src/snapshot.c 40 ●●●● patch | view | raw | blame | history
src/snapshot.h 1 ●●●● patch | view | raw | blame | history
src/io.c
@@ -254,17 +254,23 @@
    xml_trisurf_data(fh,vesicle);
    fprintf(fh, " <UnstructuredGrid>\n");
    fprintf(fh, "<Piece NumberOfPoints=\"%u\" NumberOfCells=\"%u\">\n",vlist->n+monono*polyno+fonono*filno, blist->n+monono*polyno+filno*(fonono-1)+vesicle->tlist->n);
    fprintf(fh,"<PointData Scalars=\"vertices_idx\">\n<DataArray type=\"Int64\" Name=\"vertices_idx\" format=\"ascii\">");
    fprintf(fh,"<PointData Scalars=\"vertices_idx\">\n<DataArray type=\"Int64\" Name=\"vertices_idx\" format=\"binary\">");
    int *int_vector=(int *)malloc(vlist->n+monono*polyno+fonono*filno*sizeof(ts_uint));
    int offset=0;
       for(i=0;i<vlist->n;i++){
        fprintf(fh,"%u ",vtx[i]->idx);
    //    fprintf(fh,"%u ",vtx[i]->idx);
        int_vector[i+offset]=vtx[i]->idx;
    }
    //polymeres
    if(poly){
        poly_idx=vlist->n;
        offset=offset+i;
        for(i=0;i<vesicle->poly_list->n;i++){
            for(j=0;j<vesicle->poly_list->poly[i]->vlist->n;j++,poly_idx++){
                fprintf(fh,"%u ", poly_idx);
                //fprintf(fh,"%u ", poly_idx);
                int_vector[j+offset]=poly_idx;
            }
            offset=offset+j;
        }
    }
    //filaments
@@ -273,10 +279,15 @@
        for(i=0;i<vesicle->filament_list->n;i++){
            for(j=0;j<vesicle->filament_list->poly[i]->vlist->n;j++,poly_idx++){
    //    fprintf(stderr,"was here\n");
                fprintf(fh,"%u ", poly_idx);
                //fprintf(fh,"%u ", poly_idx);
                int_vector[j+offset]=poly_idx;
            }
            offset=offset+j;
        }
    }
    char *printout=ts_compress_intlist(int_vector,vlist->n+monono*polyno+fonono*filno*sizeof(ts_uint));
    fprintf(fh,"%s",printout);
    free(printout);
        fprintf(fh,"</DataArray>\n");
    if(cstlist!=NULL){
src/snapshot.c
@@ -9,6 +9,7 @@
#include<inttypes.h>
#include<config.h>
#include <time.h>
#include <string.h>
#include "io.h"
/* a helper function that utilizes ts_string data structure and performs same as sprintf */
ts_uint ts_sprintf(ts_string *str, char *fmt, ...){
@@ -34,14 +35,14 @@
    xml_trisurf_vtx_tristar(data,vesicle->vlist);
    xml_trisurf_nucleus(data,vesicle);
    xml_trisurf_constvolarea(data,V0,A0);
#ifdef COMPRESSION
//#ifdef COMPRESSION
    char *compressed;
    ts_uint nbytes=ts_compress_string64(data->string, data->beg-1, &compressed); //suppress null character at the end with by substracting 1
    fwrite(compressed, sizeof(unsigned char), nbytes, fh);
    free (compressed);
#else
    fprintf(fh,"%s", data->string);
#endif
//#else
//    fprintf(fh,"%s", data->string);
//#endif
    free(data->string);  /* TODO: valgrind is not ok with this! */
    free(data);
    xml_trisurf_footer(fh);
@@ -145,27 +146,46 @@
/* zlib compression base64 encoded */
/* compressed must not be pre-malloced */
/* taken from https://gist.github.com/arq5x/5315739 */
ts_uint ts_compress_string64(char *data, ts_uint data_len, char **compressed){
ts_uint ts_compress_data(char *data, ts_uint data_len, char **compressed){
    z_stream defstream;
    defstream.zalloc = Z_NULL;
    defstream.zfree = Z_NULL;
    defstream.opaque = Z_NULL;
    defstream.avail_in = data_len+1;
    defstream.next_in = (unsigned char *)data;    
    char *compr=(char *)malloc(data_len*sizeof(char *));
    fprintf(stderr,"WAS HERE %d\n", data_len);
    *compressed=(char *)malloc(data_len*sizeof(char *));
    defstream.avail_out = data_len+1;
    defstream.next_out = (unsigned char *)compr;
    defstream.next_out = (unsigned char *)*compressed;
    deflateInit(&defstream, Z_BEST_COMPRESSION);
        deflate(&defstream, Z_FINISH);
        deflateEnd(&defstream);
    /*base64 encode*/
    return defstream.total_out;
}
ts_uint ts_compress_string64(char *data, ts_uint data_len, char **encoded_compressed){
    size_t nbase;
    *compressed=base64_encode((unsigned char *)compr,(size_t)defstream.total_out,&nbase);
    //fwrite(base64, sizeof(unsigned char), nbase, fh);
    char *compr;
    size_t number_of_compressed_bytes=ts_compress_data(data, data_len, &compr);
    *encoded_compressed=base64_encode((unsigned char *)compr,number_of_compressed_bytes,&nbase);
    free(compr);
    return nbase;
}
char *ts_compress_intlist(int *data, ts_uint data_len){
    size_t nbase;
    char *compr;
    size_t number_of_compressed_bytes=ts_compress_data((char *)data, data_len*sizeof(int), &compr);
    char *encoded_compressed=base64_encode((unsigned char *)compr,number_of_compressed_bytes,&nbase);
    free(compr);
    ts_uint header[4]={1, data_len, data_len, nbase};
    char *encoded_header=(char *)base64_encode((unsigned char *)header, 4*sizeof(ts_uint), &nbase);
    encoded_header=realloc(encoded_header, 4*sizeof(ts_uint)+strlen(encoded_compressed));
    encoded_header=strcat(encoded_header,encoded_compressed);
    free(encoded_compressed);
    return encoded_header;
}
ts_uint ts_decompress_string64(char *b64, ts_uint data_len, char **decompressed){
return TS_SUCCESS;
src/snapshot.h
@@ -26,4 +26,5 @@
void build_decoding_table();
void base64_cleanup();
ts_uint ts_compress_string64(char *data, ts_uint data_len, char **compressed);
char *ts_compress_intlist(int *data, ts_uint data_len);
#endif