Trisurf Monte Carlo simulator
Samo Penic
2019-10-19 1eb75bcca71b97196c1ad29da5d082a21b12cf00
Did restore. Segfaults.
2 files modified
104 ■■■■ changed files
src/b64zlib_compression.c 6 ●●●●● patch | view | raw | blame | history
src/restore.c 98 ●●●● patch | view | raw | blame | history
src/b64zlib_compression.c
@@ -98,17 +98,19 @@
    return return_value;
}
char  *ts_decompress(unsigned char *compressed_data, unsigned int data_len, unsigned int result_len){
char  *ts_decompress(unsigned char *compressed_data, unsigned int data_len, size_t *decompressed_length){
    const size_t encoded_header_len=24;
    ts_uint *header;
    size_t nbase1=0,nbase2=0;
    header=(ts_uint *)base64_decode((const char *)compressed_data, encoded_header_len, &nbase2);
    if(header==NULL) fprintf(stderr, "Error decoding header\n");
    //fprintf(stderr,"Header=%d, %d, %d, %d\n", header[0],header[1], header[2], header[3]);
    unsigned long result_len=header[2];
    unsigned char *decoded_data=base64_decode((const char *)&compressed_data[encoded_header_len], data_len-encoded_header_len, &nbase1);
    if(decoded_data==NULL) fprintf(stderr, "Error decoding compressed data\n");
    unsigned char *return_value=(unsigned char *)malloc(result_len*sizeof(char));
    uncompress(return_value, (unsigned long *)&result_len, decoded_data, header[3]);
    uncompress(return_value, &result_len, decoded_data, header[3]);
    *decompressed_length=result_len;
    free(decoded_data);
    free(header);
    return (char *)return_value;
src/restore.c
@@ -7,7 +7,7 @@
#include <general.h>
#include <restore.h>
#include <snapshot.h>
#include <zlib.h>
#include <b64zlib_compression.h>
#include "vesicle.h"
#include "vertex.h"
#include "triangle.h"
@@ -332,8 +332,8 @@
    xmlNodePtr child = cur->xmlChildrenNode;
    xmlChar *property_name;
    xmlChar *values;
    char *vals;
    char *token;
//    char *vals;
//    char *token;
    int idx, polyidx, monoidx, filidx, fonoidx;
    while (child != NULL) {
        if ((!xmlStrcmp(child->name, (const xmlChar *)"DataArray"))){
@@ -341,24 +341,26 @@
        //    fprintf(stderr,"Name: %s\n", property_name);
            if(!xmlStrcmp(property_name,(const xmlChar *)"spontaneous_curvature")){
                values=xmlNodeListGetString(doc,child->xmlChildrenNode,1);
                vals=(char *)values;
                token=strtok(vals," ");
                idx=0;
                while(token!=NULL){
//                vals=(char *)values;
                unsigned long data_len=0;
                ts_double *curv_values=(double *)ts_decompress((unsigned char *)values,strlen((char *)values), &data_len);
//                token=strtok(vals," ");
                for(idx=0;idx<data_len;idx++){
//                while(token!=NULL){
                    if(idx<vesicle->vlist->n){
                        vesicle->vlist->vtx[idx]->c=atof(token);
                        vesicle->vlist->vtx[idx]->c=curv_values[idx]; //atof(token);
                    } else if(vesicle->tape->nmono && vesicle->tape->npoly && idx<vesicle->vlist->n+vesicle->tape->nmono*vesicle->tape->npoly) {
                        polyidx=(idx-vesicle->vlist->n)/vesicle->tape->nmono;
                        monoidx=(idx-vesicle->vlist->n)%vesicle->tape->nmono;
                        vesicle->poly_list->poly[polyidx]->vlist->vtx[monoidx]->c=atof(token);
                        vesicle->poly_list->poly[polyidx]->vlist->vtx[monoidx]->c=curv_values[idx];//atof(token);
                    } else {
                        filidx=(idx-vesicle->vlist->n-vesicle->tape->nmono*vesicle->tape->npoly)/vesicle->tape->nfono;
                        fonoidx=(idx-vesicle->vlist->n-vesicle->tape->nmono*vesicle->tape->npoly)%vesicle->tape->nfono;
                        //fprintf(stderr,"filidx=%d, fonoidx=%d, coord=%s,%s,%s\n",filidx,fonoidx,token[0],token[1],token[2]);
                        vesicle->filament_list->poly[filidx]->vlist->vtx[fonoidx]->c=atof(token);
                        vesicle->filament_list->poly[filidx]->vlist->vtx[fonoidx]->c=curv_values[idx];//atof(token);
                    }
                    idx++;
                    token=strtok(NULL," ");
                    //idx++;
                    //token=strtok(NULL," ");
                }
                xmlFree(values);        
            }
@@ -373,39 +375,41 @@
ts_bool parseXMLVertexPosition(ts_vesicle *vesicle,xmlDocPtr doc, xmlNodePtr cur){
    xmlNodePtr child = cur->xmlChildrenNode;
    xmlChar *points;
    char *pts;
    int i, idx, polyidx, monoidx, filidx, fonoidx;
    char *token[3];
//    char *pts;
    int idx, polyidx, monoidx, filidx, fonoidx;
//    char *token[3];
    while (child != NULL) {
        if ((!xmlStrcmp(child->name, (const xmlChar *)"DataArray"))){
            points = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
            pts=(char *)points;
            token[0]=strtok(pts," ");
            token[1]=strtok(NULL," ");
            token[2]=strtok(NULL,"\n");
            idx=0;
            while(token[0]!=NULL){
            unsigned long data_len=0;
            ts_double *coords=(double *)ts_decompress((unsigned char *)points,strlen((char *)points), &data_len);
            //pts=(char *)points;
            //token[0]=strtok(pts," ");
            //token[1]=strtok(NULL," ");
            //token[2]=strtok(NULL,"\n");
            for(idx=0;idx<data_len;idx+=3){
//            while(token[0]!=NULL){
                if(idx<vesicle->vlist->n){
                    vesicle->vlist->vtx[idx]->x=atof(token[0]);
                    vesicle->vlist->vtx[idx]->y=atof(token[1]);
                    vesicle->vlist->vtx[idx]->z=atof(token[2]);
                    vesicle->vlist->vtx[idx]->x=coords[idx];//atof(token[0]);
                    vesicle->vlist->vtx[idx]->y=coords[idx+1];//atof(token[1]);
                    vesicle->vlist->vtx[idx]->z=coords[idx+2];//atof(token[2]);
                } else if(vesicle->tape->nmono && vesicle->tape->npoly && idx<vesicle->vlist->n+vesicle->tape->nmono*vesicle->tape->npoly) {
                    polyidx=(idx-vesicle->vlist->n)/vesicle->tape->nmono;
                    monoidx=(idx-vesicle->vlist->n)%vesicle->tape->nmono;
                    vesicle->poly_list->poly[polyidx]->vlist->vtx[monoidx]->x=atof(token[0]);
                    vesicle->poly_list->poly[polyidx]->vlist->vtx[monoidx]->y=atof(token[1]);
                    vesicle->poly_list->poly[polyidx]->vlist->vtx[monoidx]->z=atof(token[2]);
                    vesicle->poly_list->poly[polyidx]->vlist->vtx[monoidx]->x=coords[idx];//atof(token[0]);
                    vesicle->poly_list->poly[polyidx]->vlist->vtx[monoidx]->y=coords[idx+1];//atof(token[1]);
                    vesicle->poly_list->poly[polyidx]->vlist->vtx[monoidx]->z=coords[idx+2];//atof(token[2]);
                } else {
                    filidx=(idx-vesicle->vlist->n-vesicle->tape->nmono*vesicle->tape->npoly)/vesicle->tape->nfono;
                    fonoidx=(idx-vesicle->vlist->n-vesicle->tape->nmono*vesicle->tape->npoly)%vesicle->tape->nfono;
                    //fprintf(stderr,"filidx=%d, fonoidx=%d, coord=%s,%s,%s\n",filidx,fonoidx,token[0],token[1],token[2]);
                    vesicle->filament_list->poly[filidx]->vlist->vtx[fonoidx]->x=atof(token[0]);
                    vesicle->filament_list->poly[filidx]->vlist->vtx[fonoidx]->y=atof(token[1]);
                    vesicle->filament_list->poly[filidx]->vlist->vtx[fonoidx]->z=atof(token[2]);
                    vesicle->filament_list->poly[filidx]->vlist->vtx[fonoidx]->x=coords[idx];//atof(token[0]);
                    vesicle->filament_list->poly[filidx]->vlist->vtx[fonoidx]->y=coords[idx+1];//atof(token[1]);
                    vesicle->filament_list->poly[filidx]->vlist->vtx[fonoidx]->z=coords[idx+2];//atof(token[2]);
                }
                for(i=0;i<2;i++)    token[i]=strtok(NULL," ");
                token[2]=strtok(NULL,"\n");
                idx++;
                //for(i=0;i<2;i++)    token[i]=strtok(NULL," ");
                //token[2]=strtok(NULL,"\n");
                //idx++;
            }
            xmlFree(points);
        }
@@ -419,39 +423,37 @@
ts_bool parseXMLBonds(ts_vesicle *vesicle,xmlDocPtr doc, xmlNodePtr cur){
    xmlNodePtr child = cur->xmlChildrenNode;
    xmlChar *bonds, *conname;
    char *b;
//    char *b;
    int idx, polyidx;
    char *token[2];
    int temp_cnt=0;
//    char *token[2];
//    int temp_cnt=0;
    while (child != NULL) {
        conname=xmlGetProp(child, (xmlChar *)"Name");
        if ((!xmlStrcmp(child->name, (const xmlChar *)"DataArray")) && !xmlStrcmp(conname, (const xmlChar *)"connectivity") ){
            bonds = xmlNodeListGetString(doc, child->xmlChildrenNode, 1);
            b=(char *)bonds;
            token[0]=strtok(b," ");
            token[1]=strtok(NULL,"\n");
            idx=0;
            while(token[0]!=NULL){
            unsigned long data_len=0;
            unsigned long *conn=(unsigned long *)ts_decompress((unsigned char *)bonds,strlen((char *)bonds), &data_len);
            //token[0]=strtok(b," ");
            //token[1]=strtok(NULL,"\n");
            for(idx=0;idx<data_len;idx+=2){
//            while(token[0]!=NULL){
                if(idx<3*(vesicle->vlist->n-2)){
                    bond_add(vesicle->blist, vesicle->vlist->vtx[atoi(token[0])], vesicle->vlist->vtx[atoi(token[1])]);
                    bond_add(vesicle->blist, vesicle->vlist->vtx[conn[idx]], vesicle->vlist->vtx[conn[idx+1]]);
                    //fprintf(stderr,"Bonds in vesicle count idx=%d\n",idx);
                }
                else {
                //find grafted vtx
                    if(vesicle->tape->npoly && vesicle->tape->nmono && (vesicle->tape->nmono-1)==(idx-3*(vesicle->vlist->n-2))%(vesicle->tape->nmono)
                        && idx<(3*vesicle->vlist->n-2+vesicle->tape->nmono*vesicle->tape->npoly)){
                        temp_cnt++;
//                        temp_cnt++;
                        //fprintf(stderr,"%d: Bonds in poly count idx=%d, t1=%s t2=%s\n",temp_cnt,idx, token[0], token[1]);
                        
                        polyidx=(idx-3*(vesicle->vlist->n-2))/(vesicle->tape->nmono);
                        //fprintf(stderr,"poly=%d, vertex=%d\n",polyidx,atoi(token[0]));
                        vesicle->poly_list->poly[polyidx]->grafted_vtx=vesicle->vlist->vtx[atoi(token[0])];
                        vesicle->vlist->vtx[atoi(token[0])]->grafted_poly=vesicle->poly_list->poly[polyidx];
                        vesicle->poly_list->poly[polyidx]->grafted_vtx=vesicle->vlist->vtx[conn[idx]];
                        vesicle->vlist->vtx[conn[idx]]->grafted_poly=vesicle->poly_list->poly[polyidx];
                    }
                }
                token[0]=strtok(NULL," ");
                token[1]=strtok(NULL,"\n");
                idx++;
            }
            xmlFree(bonds);
        }