From ee84bde159fa91d6f1907cf3d8c39cfe50638444 Mon Sep 17 00:00:00 2001 From: Samo Penic <samo.penic@fe.uni-lj.si> Date: Wed, 12 Nov 2014 18:51:28 +0000 Subject: [PATCH] Started writting vtk dump file restoration --- src/Makefile.am | 4 src/dumpstate.c | 74 ++++++++++++++ src/main.c | 11 ++ configure.ac | 2 src/io.c | 4 config.h.in | 3 config.h | 3 aclocal.m4 | 160 ++++++++++++++++++++++++++++++++ src/dumpstate.h | 31 ++++++ src/io.h | 1 10 files changed, 291 insertions(+), 2 deletions(-) diff --git a/aclocal.m4 b/aclocal.m4 index 3a9a040..da47901 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -20,6 +20,166 @@ If you have problems, you may need to regenerate the build system entirely. To do so, use the procedure documented by the package, typically 'autoreconf'.])]) +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 1 (pkg-config-0.24) +# +# Copyright © 2004 Scott James Remnant <scott@netsplit.com>. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +# only at the first occurence in configure.ac, so if the first place +# it's called might be skipped (such as if it is within an "if", you +# have to call PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])# PKG_CHECK_MODULES + # Copyright (C) 2002-2013 Free Software Foundation, Inc. # # This file is free software; the Free Software Foundation diff --git a/config.h b/config.h index ac9c24a..b730cc2 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 `xml2' library (-lxml2). */ +/* #undef HAVE_LIBXML2 */ + /* 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..d480e81 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 `xml2' library (-lxml2). */ +#undef HAVE_LIBXML2 + /* 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 2ebed26..3d3e095 100644 --- a/configure.ac +++ b/configure.ac @@ -17,6 +17,8 @@ AC_CHECK_LIB([gslcblas],[cblas_dgemm]) AC_CHECK_LIB([gsl],[gsl_blas_dgemm]) +#AC_CHECK_LIB([xml2],[xmlNodeListGetString]) +PKG_CHECK_MODULES([libxml2], [libxml-2.0]) # Checks for header files. AC_CHECK_HEADERS([stdlib.h string.h]) diff --git a/src/Makefile.am b/src/Makefile.am index b81035d..5091e90 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,6 +1,8 @@ bin_PROGRAMS = trisurf -trisurf_SOURCES = general.c vertex.c bond.c triangle.c cell.c vesicle.c initial_distribution.c io.c frame.c energy.c timestep.c vertexmove.c bondflip.c main.c poly.c stats.c sh.c shcomplex.c constvol.c +trisurf_SOURCES = general.c vertex.c bond.c triangle.c cell.c vesicle.c initial_distribution.c io.c dumpstate.c frame.c energy.c timestep.c vertexmove.c bondflip.c main.c poly.c stats.c sh.c shcomplex.c constvol.c AM_CFLAGS = -Wall -Werror +AM_CPPFLAGS = ${libxml2_CFLAGS} +trisurf_LDADD = ${libcurl_LIBS} ${libxml2_LIBS} #shdiscoverdir=../ #shdiscover_PROGRAMS= shdiscover #shdiscover_SOURCES= general.c vertex.c bond.c triangle.c cell.c vesicle.c initial_distribution.c io.c energy.c sh.c shdiscover.c poly.c stats.c shcomplex.c diff --git a/src/dumpstate.c b/src/dumpstate.c new file mode 100644 index 0000000..4d7dde2 --- /dev/null +++ b/src/dumpstate.c @@ -0,0 +1,74 @@ +#include <string.h> +#include "general.h" +#include <stdio.h> +#include "initial_distribution.h" +#include "vesicle.h" +#include "dumpstate.h" +#include <libxml/parser.h> +#include <libxml/tree.h> + +ts_vesicle *vtk2vesicle(char *filename, ts_tape *tape){ + + ts_uint nshell=tape->nshell; + ts_uint ncmax1=tape->ncxmax; + ts_uint ncmax2=tape->ncymax; + ts_uint ncmax3=tape->nczmax; + ts_double stepsize=tape->stepsize; + + ts_uint no_vertices=5*nshell*nshell+2; + ts_vesicle *vesicle=init_vesicle(no_vertices,ncmax1,ncmax2,ncmax3,stepsize); + vesicle->nshell=nshell; + parse_vtk(filename, vesicle); + exit(1); + return vesicle; +} + + +ts_bool parse_vtk(char *filename, ts_vesicle *vesicle){ + xmlDoc *doc; + xmlNode *root_element=NULL; + xmlNode *cur_node = NULL; + doc = xmlReadFile(filename, NULL, 0); + root_element=xmlDocGetRootElement(doc); + cur_node=root_element->children; + while(cur_node!=NULL){ +// fprintf(stderr,"Node name is: %s\n",cur_node->name); + if(strcmp((char *)cur_node->name,"UnstructuredGrid")==0) break; + cur_node=cur_node->next; + } + + cur_node=cur_node->children; + while(cur_node!=NULL){ +// fprintf(stderr,"Node name is: %s\n",cur_node->name); + cur_node=cur_node->next; + if(strcmp((char *)cur_node->name,"Piece")==0) break; + } + + cur_node=cur_node->children; + while(cur_node!=NULL){ + fprintf(stderr,"Node name is: %s\n",cur_node->name); + cur_node=cur_node->next; + if(strcmp((char *)cur_node->name,"PointData")==0) vtk_index2vesicle(cur_node->children->next->children, vesicle); + if(strcmp((char *)cur_node->name,"Points")==0) break; + if(strcmp((char *)cur_node->name,"Cells")==0) break; + + } + + + + return TS_SUCCESS; +} + + +ts_bool vtk_index2vesicle(xmlNode *node, ts_vesicle *vesicle){ + //fprintf(stderr, "vsebina: %s\n",node->content); + ts_uint i; + char *token; + token = strtok((char *)node->content, " "); + for(i=0;i<vesicle->vlist->n;i++){ + vesicle->vlist->vtx[i]->idx=atoi(token); + token=strtok(NULL," "); + } + //fprintf(stderr,"idx[11]=%d\n",vesicle->vlist->vtx[11]->idx); + return TS_SUCCESS; +} diff --git a/src/dumpstate.h b/src/dumpstate.h new file mode 100644 index 0000000..fdf54f6 --- /dev/null +++ b/src/dumpstate.h @@ -0,0 +1,31 @@ +#ifndef _H_DUMPSTATE +#define _H_DUMPSTATE + +#include <libxml/parser.h> +#include <libxml/tree.h> + + + +typedef struct { + long int npoints; + long int ncells; + long int idx; + ts_double *x; + ts_double *y; + ts_double *z; + + long int neigh_idx1; + long int neigh_idx2; +} ts_vtk_data; + + + + + +ts_vesicle *vtk2vesicle(char *filename, ts_tape *tape); +ts_bool parse_vtk(char *filename, ts_vesicle *vesicle); +ts_bool vtk_index2vesicle(xmlNode *node, ts_vesicle *vesicle); + + + +#endif diff --git a/src/io.c b/src/io.c index ead2de3..f913762 100644 --- a/src/io.c +++ b/src/io.c @@ -454,6 +454,7 @@ {"dump-filename", required_argument,0, 'f'}, {"tape-options",required_argument,0,'c'}, {"tape-template", required_argument,0,0}, + {"dump-from-vtk",required_argument,0,0}, {0, 0, 0, 0} }; /* getopt_long stores the option index here. */ @@ -480,6 +481,9 @@ if(strcmp(long_options[option_index].name,"tape-template")==0){ strcpy(command_line_args.tape_templatefull,optarg); } + if(strcmp(long_options[option_index].name,"dump-from-vtk")==0){ + strcpy(command_line_args.dump_from_vtk,optarg); + } break; case 'c': diff --git a/src/io.h b/src/io.h index ec04fb1..69de4e9 100644 --- a/src/io.h +++ b/src/io.h @@ -17,6 +17,7 @@ char tape_fullfilename[1024]; //name of the tape file char tape_templatefull[1024]; //name of the tape template file char tape_opts[1000]; //commandline tape options + char dump_from_vtk[1024]; } ts_args; ts_args command_line_args; diff --git a/src/main.c b/src/main.c index 7d3726a..c55d30a 100644 --- a/src/main.c +++ b/src/main.c @@ -14,6 +14,7 @@ #include "poly.h" #include "sh.h" #include "shcomplex.h" +#include "dumpstate.h" /** Entrance function to the program * @param argv is a number of parameters used in program call (including the program name @@ -28,7 +29,15 @@ force_from_tape=0; parse_args(argv,argc); // sets global variable command_line_args (defined in io.h) ts_fprintf(stdout,"Starting program...\n\n"); - if(command_line_args.force_from_tape){ + + if(command_line_args.dump_from_vtk[0]!=0){ + ts_fprintf(stdout,"************************************************\n"); + ts_fprintf(stdout,"***** Dumping vesicle from VTK points list *****\n"); + ts_fprintf(stdout,"************************************************\n\n"); + tape=parsetape(command_line_args.tape_fullfilename); + vesicle=vtk2vesicle(command_line_args.dump_from_vtk,tape); + } + else if(command_line_args.force_from_tape){ ts_fprintf(stdout,"************************************************\n"); ts_fprintf(stdout,"**** Generating initial geometry from tape *****\n"); ts_fprintf(stdout,"************************************************\n\n"); -- Gitblit v1.9.3