From 22721d3dc98cae61db96021c01ee8dc1cbdf462d Mon Sep 17 00:00:00 2001 From: Samo Penic <samo.penic@gmail.com> Date: Mon, 15 Feb 2016 18:51:48 +0000 Subject: [PATCH] Added zlib and compression as an option to snapshots --- configure.ac | 1 src/snapshot.c | 80 ++++++++++++++++++++------ src/tape | 2 config.h.in | 3 + config.h | 3 + aclocal.m4 | 65 ++++++++++++++++++++- src/snapshot.h | 17 ++++- 7 files changed, 141 insertions(+), 30 deletions(-) diff --git a/aclocal.m4 b/aclocal.m4 index da47901..7657505 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -180,6 +180,61 @@ fi[]dnl ])# PKG_CHECK_MODULES + +# PKG_INSTALLDIR(DIRECTORY) +# ------------------------- +# Substitutes the variable pkgconfigdir as the location where a module +# should install pkg-config .pc files. By default the directory is +# $libdir/pkgconfig, but the default can be changed by passing +# DIRECTORY. The user can override through the --with-pkgconfigdir +# parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +]) dnl PKG_INSTALLDIR + + +# PKG_NOARCH_INSTALLDIR(DIRECTORY) +# ------------------------- +# Substitutes the variable noarch_pkgconfigdir as the location where a +# module should install arch-independent pkg-config .pc files. By +# default the directory is $datadir/pkgconfig, but the default can be +# changed by passing DIRECTORY. The user can override through the +# --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +]) dnl PKG_NOARCH_INSTALLDIR + + +# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# ------------------------------------------- +# Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])# PKG_CHECK_VAR + # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation @@ -263,10 +318,9 @@ # configured tree to be moved without reconfiguration. AC_DEFUN([AM_AUX_DIR_EXPAND], -[dnl Rely on autoconf to set up CDPATH properly. -AC_PREREQ([2.50])dnl -# expand $ac_aux_dir to an absolute path -am_aux_dir=`cd $ac_aux_dir && pwd` +[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl +# Expand $ac_aux_dir to an absolute path. +am_aux_dir=`cd "$ac_aux_dir" && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- @@ -733,7 +787,8 @@ END AC_MSG_ERROR([Your 'rm' program is bad, sorry.]) fi -fi]) +fi +]) dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further diff --git a/config.h b/config.h index ac9c24a..81910a1 100644 --- a/config.h +++ b/config.h @@ -16,6 +16,9 @@ /* Define to 1 if you have the `m' library (-lm). */ #define HAVE_LIBM 1 +/* Define to 1 if you have the `z' library (-lz). */ +#define HAVE_LIBZ 1 + /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #define HAVE_MALLOC 1 diff --git a/config.h.in b/config.h.in index f865b7a..b68dfc5 100644 --- a/config.h.in +++ b/config.h.in @@ -15,6 +15,9 @@ /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM +/* Define to 1 if you have the `z' library (-lz). */ +#undef HAVE_LIBZ + /* Define to 1 if your system has a GNU libc compatible `malloc' function, and to 0 otherwise. */ #undef HAVE_MALLOC diff --git a/configure.ac b/configure.ac index 3d3e095..4a01fa5 100644 --- a/configure.ac +++ b/configure.ac @@ -19,6 +19,7 @@ AC_CHECK_LIB([gsl],[gsl_blas_dgemm]) #AC_CHECK_LIB([xml2],[xmlNodeListGetString]) PKG_CHECK_MODULES([libxml2], [libxml-2.0]) +AC_CHECK_LIB([z],[deflate]) # Checks for header files. AC_CHECK_HEADERS([stdlib.h string.h]) diff --git a/src/snapshot.c b/src/snapshot.c index c845e06..ee735f8 100644 --- a/src/snapshot.c +++ b/src/snapshot.c @@ -1,12 +1,52 @@ #include<stdio.h> #include<general.h> #include<snapshot.h> +#include<stdlib.h> +#include<stdarg.h> +#include <zlib.h> +ts_uint ts_sprintf(ts_string *str, char *fmt, ...){ + va_list ap; + va_start(ap,fmt); + ts_uint n=vsprintf(&(str->string[str->beg]),fmt,ap); + va_end(ap); + str->beg+=n; + return n; +} + + ts_bool xml_trisurf_data(FILE *fh, ts_vesicle *vesicle){ + + ts_string *data=(ts_string *)malloc(sizeof(ts_sprintf)); + data->string=(char *)malloc(512000*sizeof(char)); /*TODO: warning, can break if the string is to long */ + data->beg=0; + xml_trisurf_header(fh, vesicle); - xml_trisurf_tria(fh,vesicle->tlist); - xml_trisurf_tria_neigh(fh,vesicle->tlist); - xml_trisurf_vtx_neigh(fh,vesicle->vlist); - xml_trisurf_vtx_tristar(fh,vesicle->vlist); + xml_trisurf_tria(data,vesicle->tlist); + xml_trisurf_tria_neigh(data,vesicle->tlist); + xml_trisurf_vtx_neigh(data,vesicle->vlist); + xml_trisurf_vtx_tristar(data,vesicle->vlist); +#ifdef COMPRESSION + z_stream defstream; + defstream.zalloc = Z_NULL; + defstream.zfree = Z_NULL; + defstream.opaque = Z_NULL; + defstream.avail_in = data->beg+1; + defstream.next_in = (unsigned char *)data->string; + char *compr=(char *)malloc((data->beg+1)*sizeof(char *)); + defstream.avail_out = data->beg+1; + defstream.next_out = (unsigned char *)compr; + deflateInit(&defstream, Z_BEST_COMPRESSION); + deflate(&defstream, Z_FINISH); + deflateEnd(&defstream); + fwrite(compr, sizeof(unsigned char), defstream.total_out, fh); +// fprintf(fh,"%s",compr); +//printf("Uncompressed size is: %lu\n", defstream.total_out); + free(compr); +#else + fprintf(fh,"%s", data->string); +#endif + free(data->string); + free(data); xml_trisurf_footer(fh); return TS_SUCCESS; } @@ -21,46 +61,46 @@ return TS_SUCCESS; } -ts_bool xml_trisurf_tria(FILE *fh, ts_triangle_list *tlist){ +ts_bool xml_trisurf_tria(ts_string *data, ts_triangle_list *tlist){ ts_uint i; - fprintf(fh,"<tria>\n"); + ts_sprintf(data,"<tria>\n"); for(i=0; i<tlist->n;i++){ - fprintf(fh,"%u %u %u\n",tlist->tria[i]->vertex[0]->idx, tlist->tria[i]->vertex[1]->idx, tlist->tria[i]->vertex[2]->idx); + ts_sprintf(data,"%u %u %u\n",tlist->tria[i]->vertex[0]->idx, tlist->tria[i]->vertex[1]->idx, tlist->tria[i]->vertex[2]->idx); } - fprintf(fh,"</tria>\n"); + ts_sprintf(data,"</tria>\n"); return TS_SUCCESS; } -ts_bool xml_trisurf_tria_neigh(FILE *fh, ts_triangle_list *tlist){ +ts_bool xml_trisurf_tria_neigh(ts_string *data, ts_triangle_list *tlist){ ts_uint i; - fprintf(fh,"<trianeigh>\n"); + ts_sprintf(data,"<trianeigh>\n"); for(i=0; i<tlist->n;i++){ - fprintf(fh,"%u %u %u\n",tlist->tria[i]->neigh[0]->idx, tlist->tria[i]->neigh[1]->idx, tlist->tria[i]->neigh[2]->idx); + ts_sprintf(data,"%u %u %u\n",tlist->tria[i]->neigh[0]->idx, tlist->tria[i]->neigh[1]->idx, tlist->tria[i]->neigh[2]->idx); } - fprintf(fh,"</trianeigh>\n"); + ts_sprintf(data,"</trianeigh>\n"); return TS_SUCCESS; } -ts_bool xml_trisurf_vtx_neigh(FILE *fh, ts_vertex_list *vlist){ +ts_bool xml_trisurf_vtx_neigh(ts_string *data, ts_vertex_list *vlist){ ts_uint i,j; for(i=0;i<vlist->n;i++){ - fprintf(fh,"<vtxn idx=\"%u\">",vlist->vtx[i]->idx); + ts_sprintf(data,"<vtxn idx=\"%u\">",vlist->vtx[i]->idx); for(j=0;j<vlist->vtx[i]->neigh_no;j++){ - fprintf(fh,"%u ",vlist->vtx[i]->neigh[j]->idx); + ts_sprintf(data,"%u ",vlist->vtx[i]->neigh[j]->idx); } - fprintf(fh, "</vtxn>\n"); + ts_sprintf(data, "</vtxn>\n"); } return TS_SUCCESS; } -ts_bool xml_trisurf_vtx_tristar(FILE *fh, ts_vertex_list *vlist){ +ts_bool xml_trisurf_vtx_tristar(ts_string *data, ts_vertex_list *vlist){ ts_uint i,j; for(i=0;i<vlist->n;i++){ - fprintf(fh,"<tristar idx=\"%u\">",vlist->vtx[i]->idx); + ts_sprintf(data,"<tristar idx=\"%u\">",vlist->vtx[i]->idx); for(j=0;j<vlist->vtx[i]->tristar_no;j++){ - fprintf(fh,"%u ",vlist->vtx[i]->tristar[j]->idx); + ts_sprintf(data,"%u ",vlist->vtx[i]->tristar[j]->idx); } - fprintf(fh, "</tristar>\n"); + ts_sprintf(data, "</tristar>\n"); } return TS_SUCCESS; } diff --git a/src/snapshot.h b/src/snapshot.h index 0d1511d..4c7b528 100644 --- a/src/snapshot.h +++ b/src/snapshot.h @@ -1,11 +1,20 @@ #ifndef _H_SNAPSHOT #define _H_SNAPSHOT + + +typedef struct{ + char *string; + ts_uint beg; +} ts_string; + +#define COMPRESSION + ts_bool xml_trisurf_data(FILE *fh, ts_vesicle *vesicle); ts_bool xml_trisurf_header(FILE *fh, ts_vesicle *vesicle); ts_bool xml_trisurf_footer(FILE *fh); -ts_bool xml_trisurf_tria(FILE *fh, ts_triangle_list *tlist); -ts_bool xml_trisurf_tria_neigh(FILE *fh, ts_triangle_list *tlist); -ts_bool xml_trisurf_vtx_neigh(FILE *fh, ts_vertex_list *vlist); -ts_bool xml_trisurf_vtx_tristar(FILE *fh, ts_vertex_list *vlist); +ts_bool xml_trisurf_tria(ts_string *data, ts_triangle_list *tlist); +ts_bool xml_trisurf_tria_neigh(ts_string *data, ts_triangle_list *tlist); +ts_bool xml_trisurf_vtx_neigh(ts_string *data, ts_vertex_list *vlist); +ts_bool xml_trisurf_vtx_tristar(ts_string *data, ts_vertex_list *vlist); #endif diff --git a/src/tape b/src/tape index a604c91..3e6290b 100644 --- a/src/tape +++ b/src/tape @@ -1,6 +1,6 @@ ####### Vesicle definitions ########### # nshell is a number of divisions of dipyramid -nshell=17 +nshell=19 # dmax is the max. bond length (in units l_min) dmax=1.7 # dmin_interspecies in the min. dist. between different vertex species (in units l_min) -- Gitblit v1.9.3