Trisurf Monte Carlo simulator
Samo Penic
2020-04-13 2a1e3d528265c3d366dab9ad4b0c4d3d65e1c4ed
commit | author | age
819a09 1
7f6076 2 /* vim: set ts=4 sts=4 sw=4 noet : */
f74313 3 #include "general.h"
d7639a 4 #include<stdio.h>
SP 5 #include "io.h"
f74313 6 #include "vertex.h"
SP 7 #include "bond.h"
d7639a 8 #include<string.h>
a6b1b5 9 #include<stdlib.h>
d7639a 10 #include <sys/types.h>
SP 11 #include <dirent.h>
b14a8d 12 #include "initial_distribution.h"
a2db52 13 #include "poly.h"
055dd7 14 #include "cell.h"
083e03 15 #include <getopt.h>
SP 16 #include <sys/stat.h>
17 #include <sys/types.h>
18 #include <dirent.h>
19 #include <errno.h>
854cb6 20 #include <snapshot.h>
e9eab4 21 /** DUMP STATE TO DISK DRIVE **/
SP 22
1ab449 23 ts_bool dump_state(ts_vesicle *vesicle, ts_uint iteration){
e9eab4 24
SP 25     /* save current state with wrong pointers. Will fix that later */
26     ts_uint i,j,k;
267db5 27     FILE *fh=fopen(command_line_args.dump_fullfilename,"wb");
e9eab4 28
SP 29     /* dump vesicle */
d0a1d3 30     fwrite(vesicle, sizeof(ts_vesicle)-sizeof(ts_double),1,fh);
e9eab4 31     /* dump vertex list */
SP 32     fwrite(vesicle->vlist, sizeof(ts_vertex_list),1,fh);
33     /* dump bond list */
34     fwrite(vesicle->blist, sizeof(ts_bond_list),1,fh);
35     /* dump triangle list */
36     fwrite(vesicle->tlist, sizeof(ts_triangle_list),1,fh);
37     /* dump cell list */
38     fwrite(vesicle->clist, sizeof(ts_cell_list),1,fh);
39     /* dump poly list */
40     fwrite(vesicle->poly_list, sizeof(ts_poly_list),1,fh);
bcf455 41     /* dump filament list */
M 42     fwrite(vesicle->filament_list, sizeof(ts_poly_list),1,fh);
e9eab4 43     /* level 1 complete */
SP 44
45     /*dump vertices*/
46     for(i=0;i<vesicle->vlist->n;i++){
47         fwrite(vesicle->vlist->vtx[i],sizeof(ts_vertex),1,fh);
48         /* dump pointer offsets for:
49                     neigh
50                     bond
51                     tria
52                     cell is ignored
53         */
54         for(j=0;j<vesicle->vlist->vtx[i]->neigh_no;j++){
3c1ac1 55             fwrite(&vesicle->vlist->vtx[i]->neigh[j]->idx,sizeof(ts_uint),1,fh); 
e9eab4 56         }
SP 57         for(j=0;j<vesicle->vlist->vtx[i]->bond_no;j++){
3c1ac1 58             fwrite(&vesicle->vlist->vtx[i]->bond[j]->idx,sizeof(ts_uint),1,fh); 
e9eab4 59         }
SP 60         for(j=0;j<vesicle->vlist->vtx[i]->tristar_no;j++){
3c1ac1 61             fwrite(&vesicle->vlist->vtx[i]->tristar[j]->idx,sizeof(ts_uint),1,fh); 
e9eab4 62         }
SP 63     }
64
65     /*dump bonds*/
66     for(i=0;i<vesicle->blist->n;i++){
67         fwrite(vesicle->blist->bond[i],sizeof(ts_bond),1,fh);
68         /* dump pointer offsets for vtx1 and vtx2 */
3c1ac1 69         //off=(ts_ulong)(vesicle->blist->bond[i]->vtx1-vesicle->vlist->vtx[0]);
SP 70         fwrite(&vesicle->blist->bond[i]->vtx1->idx,sizeof(ts_uint),1,fh); 
71         //off=(ts_ulong)(vesicle->blist->bond[i]->vtx2-vesicle->vlist->vtx[0]);
72         fwrite(&vesicle->blist->bond[i]->vtx2->idx,sizeof(ts_uint),1,fh); 
e9eab4 73     }
SP 74
75     /*dump triangles*/
76     for(i=0;i<vesicle->tlist->n;i++){
77         fwrite(vesicle->tlist->tria[i],sizeof(ts_triangle),1,fh);
78         /* dump pointer offsets for vertex */
3c1ac1 79         fwrite(&vesicle->tlist->tria[i]->vertex[0]->idx,sizeof(ts_uint),1,fh); 
SP 80         fwrite(&vesicle->tlist->tria[i]->vertex[1]->idx,sizeof(ts_uint),1,fh); 
81         fwrite(&vesicle->tlist->tria[i]->vertex[2]->idx,sizeof(ts_uint),1,fh); 
e9eab4 82         /* dump pointer offsets for neigh */
SP 83         for(j=0;j<vesicle->tlist->tria[i]->neigh_no;j++){
3c1ac1 84             fwrite(&vesicle->tlist->tria[i]->neigh[j]->idx,sizeof(ts_uint),1,fh); 
e9eab4 85         }
SP 86     }
87
88
89     /*dump polymeres */
90     for(i=0;i<vesicle->poly_list->n;i++){
91         fwrite(vesicle->poly_list->poly[i],sizeof(ts_poly),1,fh);
3c1ac1 92         fwrite(vesicle->poly_list->poly[i]->vlist,sizeof(ts_vertex_list),1,fh);
SP 93         fwrite(vesicle->poly_list->poly[i]->blist,sizeof(ts_bond_list),1,fh);
e9eab4 94     } 
SP 95      
96     /* dump poly vertex(monomer) list*/
97     for(i=0;i<vesicle->poly_list->n;i++){
98         for(j=0;j<vesicle->poly_list->poly[i]->vlist->n;j++){
99             fwrite(vesicle->poly_list->poly[i]->vlist->vtx[j],sizeof(ts_vertex),1,fh);
100             /* dump offset for neigh and bond */
101             for(k=0;k<vesicle->poly_list->poly[i]->vlist->vtx[j]->neigh_no;k++){
3c1ac1 102                // off=(ts_ulong)(vesicle->poly_list->poly[i]->vlist->vtx[j]->neigh[k]-vesicle->poly_list->poly[i]->vlist->vtx[0]);
SP 103                 fwrite(&vesicle->poly_list->poly[i]->vlist->vtx[j]->neigh[k]->idx,sizeof(ts_uint),1,fh); 
e9eab4 104             }
SP 105             for(k=0;k<vesicle->poly_list->poly[i]->vlist->vtx[j]->bond_no;k++){
3c1ac1 106                 //off=(ts_ulong)(vesicle->poly_list->poly[i]->vlist->vtx[j]->bond[k]-vesicle->poly_list->poly[i]->blist->bond[0]);
SP 107                 fwrite(&vesicle->poly_list->poly[i]->vlist->vtx[j]->bond[k]->idx,sizeof(ts_uint),1,fh); 
e9eab4 108             }
SP 109         }
3c1ac1 110     // grafted vtx on vesicle data dump
SP 111         fwrite(&vesicle->poly_list->poly[i]->grafted_vtx->idx, sizeof(ts_uint),1,fh);
e9eab4 112     }
SP 113     /* dump poly bonds between monomers list*/
114     for(i=0;i<vesicle->poly_list->n;i++){
115         for(j=0;j<vesicle->poly_list->poly[i]->blist->n;j++){
116             fwrite(vesicle->poly_list->poly[i]->blist->bond[j],sizeof(ts_bond),1,fh);
117             /* dump vtx1 and vtx2 offsets */
3c1ac1 118             //off=(ts_ulong)(vesicle->poly_list->poly[i]->blist->bond[j]->vtx1-vesicle->poly_list->poly[i]->vlist->vtx[0]);
SP 119             fwrite(&vesicle->poly_list->poly[i]->blist->bond[j]->vtx1->idx,sizeof(ts_uint),1,fh); 
120 //            off=(ts_ulong)(vesicle->poly_list->poly[i]->blist->bond[j]->vtx2-vesicle->poly_list->poly[i]->vlist->vtx[0]);
121             fwrite(&vesicle->poly_list->poly[i]->blist->bond[j]->vtx2->idx,sizeof(ts_uint),1,fh); 
e9eab4 122         }
SP 123     }
124
bcf455 125
M 126   /*dump filamentes grandes svinjas */
127     for(i=0;i<vesicle->filament_list->n;i++){
128         fwrite(vesicle->filament_list->poly[i],sizeof(ts_poly),1,fh);
129         fwrite(vesicle->filament_list->poly[i]->vlist,sizeof(ts_vertex_list),1,fh);
130         fwrite(vesicle->filament_list->poly[i]->blist,sizeof(ts_bond_list),1,fh);
131     } 
132      
133     /* dump filamentes vertex(monomer) list*/
134     for(i=0;i<vesicle->filament_list->n;i++){
135         for(j=0;j<vesicle->filament_list->poly[i]->vlist->n;j++){
136             fwrite(vesicle->filament_list->poly[i]->vlist->vtx[j],sizeof(ts_vertex),1,fh);
137             /* dump offset for neigh and bond */
138             for(k=0;k<vesicle->filament_list->poly[i]->vlist->vtx[j]->neigh_no;k++){
139                // off=(ts_ulong)(vesicle->poly_list->poly[i]->vlist->vtx[j]->neigh[k]-vesicle->poly_list->poly[i]->vlist->vtx[0]);
140                 fwrite(&vesicle->filament_list->poly[i]->vlist->vtx[j]->neigh[k]->idx,sizeof(ts_uint),1,fh); 
141             }
142             for(k=0;k<vesicle->filament_list->poly[i]->vlist->vtx[j]->bond_no;k++){
143                 //off=(ts_ulong)(vesicle->poly_list->poly[i]->vlist->vtx[j]->bond[k]-vesicle->poly_list->poly[i]->blist->bond[0]);
144                 fwrite(&vesicle->filament_list->poly[i]->vlist->vtx[j]->bond[k]->idx,sizeof(ts_uint),1,fh); 
145             }
146         }
147     }
148     /* dump poly bonds between monomers list*/
149     for(i=0;i<vesicle->filament_list->n;i++){
150         for(j=0;j<vesicle->filament_list->poly[i]->blist->n;j++){
151             fwrite(vesicle->filament_list->poly[i]->blist->bond[j],sizeof(ts_bond),1,fh);
152             /* dump vtx1 and vtx2 offsets */
153             //off=(ts_ulong)(vesicle->poly_list->poly[i]->blist->bond[j]->vtx1-vesicle->poly_list->poly[i]->vlist->vtx[0]);
154             fwrite(&vesicle->filament_list->poly[i]->blist->bond[j]->vtx1->idx,sizeof(ts_uint),1,fh); 
155 //            off=(ts_ulong)(vesicle->poly_list->poly[i]->blist->bond[j]->vtx2-vesicle->poly_list->poly[i]->vlist->vtx[0]);
156             fwrite(&vesicle->filament_list->poly[i]->blist->bond[j]->vtx2->idx,sizeof(ts_uint),1,fh); 
157         }
158     }
159
160
161
e9eab4 162 /* pointer offsets for fixing the restored pointers */
SP 163 /* need pointers for 
164     vlist->vtx
165     blist->bond
166     tlist->tria
167     clist->cell
168     poly_list->poly
169     and for each poly:
170         poly_list->poly->vtx
171         poly_list->poly->bond
172 */
173
bd2210 174 //    fwrite(vesicle->clist, sizeof(ts_cell_list),1,  fh);
9166cb 175 /* write tape information on vesicle */
bd2210 176 //    fwrite(vesicle->tape,sizeof(ts_tape),1,fh);
1ab449 177     fwrite(&iteration, sizeof(ts_uint),1,fh);
e9eab4 178     fclose(fh);
SP 179     return TS_SUCCESS;
180 }
181
182
183 /** RESTORE DUMP FROM DISK **/
1ab449 184 ts_vesicle *restore_state(ts_uint *iteration){
e9eab4 185     ts_uint i,j,k;
267db5 186     FILE *fh=fopen(command_line_args.dump_fullfilename,"rb");
3f5c83 187
SP 188     struct stat sb;
267db5 189     if (stat(command_line_args.dump_fullfilename, &sb) == -1) {
3f5c83 190         //dump file does not exist.
SP 191         return NULL;
192     }
193
194     //check if it is regular file
195     if((sb.st_mode & S_IFMT) != S_IFREG) {
196         //dump file is not a regular file.
197         ts_fprintf(stderr,"Dump file is not a regular file!\n");
198         return NULL;
199     }
200
e9eab4 201     ts_uint retval;
3c1ac1 202     ts_uint idx;
e9eab4 203
SP 204 /* we restore all the data from the dump */
205     /* restore vesicle */
206     ts_vesicle *vesicle=(ts_vesicle *)calloc(1,sizeof(ts_vesicle));
d0a1d3 207     retval=fread(vesicle, sizeof(ts_vesicle)-sizeof(ts_double),1,fh);
86f5e7 208 //    fprintf(stderr,"was here! %e\n",vesicle->dmax);
SP 209
e9eab4 210     /* restore vertex list */
SP 211     vesicle->vlist=(ts_vertex_list *)malloc(sizeof(ts_vertex_list));
212     retval=fread(vesicle->vlist, sizeof(ts_vertex_list),1,fh);
213     /* restore bond list */
214     vesicle->blist=(ts_bond_list *)malloc(sizeof(ts_bond_list));
215     retval=fread(vesicle->blist, sizeof(ts_bond_list),1,fh);
216     /* restore triangle list */
217     vesicle->tlist=(ts_triangle_list *)malloc(sizeof(ts_triangle_list));
218     retval=fread(vesicle->tlist, sizeof(ts_triangle_list),1,fh);
219     /* restore cell list */
220     vesicle->clist=(ts_cell_list *)malloc(sizeof(ts_cell_list));
221     retval=fread(vesicle->clist, sizeof(ts_cell_list),1,fh);
222     /* restore poly list */
223     vesicle->poly_list=(ts_poly_list *)calloc(1,sizeof(ts_poly_list));
224     retval=fread(vesicle->poly_list, sizeof(ts_poly_list),1,fh);
bcf455 225     /* restore filament list */
M 226     vesicle->filament_list=(ts_poly_list *)calloc(1,sizeof(ts_poly_list));
227     retval=fread(vesicle->filament_list, sizeof(ts_poly_list),1,fh);
e9eab4 228     /* level 1 complete */
SP 229
3c1ac1 230 /* prerequisity. Bonds must be malloced before vertexes are recreated */
SP 231   vesicle->blist->bond=(ts_bond **)calloc(vesicle->blist->n,sizeof(ts_bond *));
232     for(i=0;i<vesicle->blist->n;i++){
233         vesicle->blist->bond[i]=(ts_bond *)malloc(sizeof(ts_bond));
234     }
235 /* prerequisity. Triangles must be malloced before vertexes are recreated */
236   vesicle->tlist->tria=(ts_triangle **)calloc(vesicle->tlist->n,sizeof(ts_triangle *));
237     for(i=0;i<vesicle->tlist->n;i++){
238         vesicle->tlist->tria[i]=(ts_triangle *)malloc(sizeof(ts_triangle));
239 }
a37ba2 240 /* prerequisity. Vertices must be malloced before vertexes are recreated */
e9eab4 241     vesicle->vlist->vtx=(ts_vertex **)calloc(vesicle->vlist->n,sizeof(ts_vertex *));
a37ba2 242  for(i=0;i<vesicle->vlist->n;i++){
e9eab4 243         vesicle->vlist->vtx[i]=(ts_vertex *)malloc(sizeof(ts_vertex));
a37ba2 244  }
SP 245   /*restore vertices*/
246     for(i=0;i<vesicle->vlist->n;i++){
e9eab4 247         retval=fread(vesicle->vlist->vtx[i],sizeof(ts_vertex),1,fh);
SP 248         /*restore neigh, bond, tristar. Ignoring cell */
249         vesicle->vlist->vtx[i]->neigh=(ts_vertex **)calloc(vesicle->vlist->vtx[i]->neigh_no, sizeof(ts_vertex *));
250         for(j=0;j<vesicle->vlist->vtx[i]->neigh_no;j++){
3c1ac1 251             retval=fread(&idx,sizeof(ts_uint),1,fh);
SP 252             vesicle->vlist->vtx[i]->neigh[j]=vesicle->vlist->vtx[idx];
e9eab4 253         }
SP 254         vesicle->vlist->vtx[i]->bond=(ts_bond **)calloc(vesicle->vlist->vtx[i]->bond_no, sizeof(ts_bond *));
255         for(j=0;j<vesicle->vlist->vtx[i]->bond_no;j++){
3c1ac1 256             retval=fread(&idx,sizeof(ts_uint),1,fh);
SP 257 /* pointer can be assigned only when list of bonds is fully initialized in memory. Thus bondlist popularization must be done before vertex can reference to it */
258             vesicle->vlist->vtx[i]->bond[j]=vesicle->blist->bond[idx];    
e9eab4 259         }
SP 260
261         vesicle->vlist->vtx[i]->tristar=(ts_triangle **)calloc(vesicle->vlist->vtx[i]->tristar_no, sizeof(ts_triangle *));
262         for(j=0;j<vesicle->vlist->vtx[i]->tristar_no;j++){
3c1ac1 263             retval=fread(&idx,sizeof(ts_uint),1,fh);
SP 264 /* same comment as above */
265             vesicle->vlist->vtx[i]->tristar[j]=vesicle->tlist->tria[idx];
e9eab4 266         }
SP 267
268     }
269
270     /*restore bonds*/
3c1ac1 271    // vesicle->blist->bond=(ts_bond **)calloc(vesicle->blist->n,sizeof(ts_bond *)); // done before.
e9eab4 272     for(i=0;i<vesicle->blist->n;i++){
3c1ac1 273      //   vesicle->blist->bond[i]=(ts_bond *)malloc(sizeof(ts_bond)); //done before.
e9eab4 274         retval=fread(vesicle->blist->bond[i],sizeof(ts_bond),1,fh);
SP 275         /* restore vtx1 and vtx2 */
3c1ac1 276         retval=fread(&idx,sizeof(ts_uint),1,fh);
SP 277         vesicle->blist->bond[i]->vtx1=vesicle->vlist->vtx[idx];
278         retval=fread(&idx,sizeof(ts_uint),1,fh);
279         vesicle->blist->bond[i]->vtx2=vesicle->vlist->vtx[idx];
e9eab4 280     }
SP 281
282     /*restore triangles*/
3c1ac1 283 //    vesicle->tlist->tria=(ts_triangle **)calloc(vesicle->tlist->n,sizeof(ts_triangle *)); // done before
e9eab4 284     for(i=0;i<vesicle->tlist->n;i++){
3c1ac1 285  //       vesicle->tlist->tria[i]=(ts_triangle *)malloc(sizeof(ts_triangle)); // done before
e9eab4 286         retval=fread(vesicle->tlist->tria[i],sizeof(ts_triangle),1,fh);
SP 287         /* restore pointers for vertices */
3c1ac1 288         retval=fread(&idx,sizeof(ts_uint),1,fh);
SP 289         vesicle->tlist->tria[i]->vertex[0]=vesicle->vlist->vtx[idx];
290         retval=fread(&idx,sizeof(ts_uint),1,fh);
291         vesicle->tlist->tria[i]->vertex[1]=vesicle->vlist->vtx[idx];
292         retval=fread(&idx,sizeof(ts_uint),1,fh);
293         vesicle->tlist->tria[i]->vertex[2]=vesicle->vlist->vtx[idx];
e9eab4 294         /* restore pointers for neigh */
3c1ac1 295      vesicle->tlist->tria[i]->neigh=(ts_triangle **)malloc(vesicle->tlist->tria[i]->neigh_no*sizeof(ts_triangle *));
e9eab4 296         for(j=0;j<vesicle->tlist->tria[i]->neigh_no;j++){
3c1ac1 297             retval=fread(&idx,sizeof(ts_uint),1,fh);
SP 298             vesicle->tlist->tria[i]->neigh[j]=vesicle->tlist->tria[idx];
e9eab4 299         }
SP 300
301     }
302    
303     /*restore cells */
304 /*TODO: do we need to recalculate cells here? */
305 /*    vesicle->clist->cell=(ts_cell **)malloc(vesicle->clist->cellno*sizeof(ts_cell *));
306     for(i=0;i<vesicle->clist->cellno;i++){
307         vesicle->clist->cell[i]=(ts_cell *)malloc(sizeof(ts_cell));
308         retval=fread(vesicle->clist->cell[i],sizeof(ts_cell),1,fh);
309     }
310 */
311     /*restore polymeres */
312     vesicle->poly_list->poly = (ts_poly **)calloc(vesicle->poly_list->n,sizeof(ts_poly *));
313     for(i=0;i<vesicle->poly_list->n;i++){
314         vesicle->poly_list->poly[i]=(ts_poly *)calloc(1,sizeof(ts_poly));
315         retval=fread(vesicle->poly_list->poly[i],sizeof(ts_poly),1,fh);
3c1ac1 316         vesicle->poly_list->poly[i]->vlist=(ts_vertex_list *)calloc(1,sizeof(ts_vertex_list));
SP 317         retval=fread(vesicle->poly_list->poly[i]->vlist,sizeof(ts_vertex_list),1,fh);
318         vesicle->poly_list->poly[i]->blist=(ts_bond_list *)calloc(1,sizeof(ts_bond_list));
319         retval=fread(vesicle->poly_list->poly[i]->blist,sizeof(ts_bond_list),1,fh);
320     /* initialize adress space for pointers that will hold specific vertices (monomers) and bonds */
321         vesicle->poly_list->poly[i]->vlist->vtx=(ts_vertex **)calloc(vesicle->poly_list->poly[i]->vlist->n,sizeof(ts_vertex *));
322         vesicle->poly_list->poly[i]->blist->bond=(ts_bond **)calloc(vesicle->poly_list->poly[i]->blist->n,sizeof(ts_bond *));
323      for(j=0;j<vesicle->poly_list->poly[i]->vlist->n;j++){
324             vesicle->poly_list->poly[i]->vlist->vtx[j]=(ts_vertex *)malloc(sizeof(ts_vertex));
325     }
326     for(j=0;j<vesicle->poly_list->poly[i]->blist->n;j++){
327             vesicle->poly_list->poly[i]->blist->bond[j]=(ts_bond *)malloc(sizeof(ts_bond));
328     }
329
e9eab4 330     } 
3c1ac1 331
e9eab4 332      
SP 333     /* restore poly vertex(monomer) list*/
334     for(i=0;i<vesicle->poly_list->n;i++){
335         for(j=0;j<vesicle->poly_list->poly[i]->vlist->n;j++){
336             retval=fread(vesicle->poly_list->poly[i]->vlist->vtx[j],sizeof(ts_vertex),1,fh);
3c1ac1 337                 
e9eab4 338             /* restore neigh and bonds */
SP 339             vesicle->poly_list->poly[i]->vlist->vtx[j]->neigh=(ts_vertex **)calloc(vesicle->poly_list->poly[i]->vlist->vtx[j]->neigh_no, sizeof(ts_vertex *));
340             for(k=0;k<vesicle->poly_list->poly[i]->vlist->vtx[j]->neigh_no;k++){
3c1ac1 341                 retval=fread(&idx,sizeof(ts_uint),1,fh);
SP 342                 vesicle->poly_list->poly[i]->vlist->vtx[j]->neigh[k]=vesicle->poly_list->poly[i]->vlist->vtx[idx];
e9eab4 343             }
SP 344             vesicle->poly_list->poly[i]->vlist->vtx[j]->bond=(ts_bond **)calloc(vesicle->poly_list->poly[i]->vlist->vtx[j]->bond_no, sizeof(ts_bond *));
345             for(k=0;k<vesicle->poly_list->poly[i]->vlist->vtx[j]->bond_no;k++){
3c1ac1 346                 retval=fread(&idx,sizeof(ts_uint),1,fh);
SP 347                 vesicle->poly_list->poly[i]->vlist->vtx[j]->bond[k]=vesicle->poly_list->poly[i]->blist->bond[idx];
e9eab4 348             }
SP 349
350         }
3c1ac1 351     /* restore grafted vtx on vesicle and grafted_poly */
SP 352                 retval=fread(&idx,sizeof(ts_uint),1,fh);
353         vesicle->vlist->vtx[idx]->grafted_poly=vesicle->poly_list->poly[i];
354         vesicle->poly_list->poly[i]->grafted_vtx=vesicle->vlist->vtx[idx];    
e9eab4 355     }
3c1ac1 356
e9eab4 357     /* restore poly bonds between monomers list*/
SP 358     for(i=0;i<vesicle->poly_list->n;i++){
359         for(j=0;j<vesicle->poly_list->poly[i]->blist->n;j++){
3c1ac1 360        //     vesicle->poly_list->poly[i]->blist->bond[j]=(ts_bond *)malloc(sizeof(ts_bond));
e9eab4 361             retval=fread(vesicle->poly_list->poly[i]->blist->bond[j],sizeof(ts_bond),1,fh);
SP 362             /* restore vtx1 and vtx2 */
3c1ac1 363                 retval=fread(&idx,sizeof(ts_uint),1,fh);
SP 364                 vesicle->poly_list->poly[i]->blist->bond[j]->vtx1=vesicle->poly_list->poly[i]->vlist->vtx[idx];
365                 retval=fread(&idx,sizeof(ts_uint),1,fh);
366                 vesicle->poly_list->poly[i]->blist->bond[j]->vtx2=vesicle->poly_list->poly[i]->vlist->vtx[idx];
e9eab4 367         }
SP 368     }
369
bcf455 370     /*restore filaments */
M 371     vesicle->filament_list->poly = (ts_poly **)calloc(vesicle->filament_list->n,sizeof(ts_poly *));
372     for(i=0;i<vesicle->filament_list->n;i++){
373         vesicle->filament_list->poly[i]=(ts_poly *)calloc(1,sizeof(ts_poly));
374         retval=fread(vesicle->filament_list->poly[i],sizeof(ts_poly),1,fh);
375         vesicle->filament_list->poly[i]->vlist=(ts_vertex_list *)calloc(1,sizeof(ts_vertex_list));
376         retval=fread(vesicle->filament_list->poly[i]->vlist,sizeof(ts_vertex_list),1,fh);
377         vesicle->filament_list->poly[i]->blist=(ts_bond_list *)calloc(1,sizeof(ts_bond_list));
378         retval=fread(vesicle->filament_list->poly[i]->blist,sizeof(ts_bond_list),1,fh);
379     /* initialize adress space for pointers that will hold specific vertices (monomers) and bonds */
380         vesicle->filament_list->poly[i]->vlist->vtx=(ts_vertex **)calloc(vesicle->filament_list->poly[i]->vlist->n,sizeof(ts_vertex *));
381         vesicle->filament_list->poly[i]->blist->bond=(ts_bond **)calloc(vesicle->filament_list->poly[i]->blist->n,sizeof(ts_bond *));
382      for(j=0;j<vesicle->filament_list->poly[i]->vlist->n;j++){
383             vesicle->filament_list->poly[i]->vlist->vtx[j]=(ts_vertex *)malloc(sizeof(ts_vertex));
384     }
385     for(j=0;j<vesicle->filament_list->poly[i]->blist->n;j++){
386             vesicle->filament_list->poly[i]->blist->bond[j]=(ts_bond *)malloc(sizeof(ts_bond));
387     }
388
389     } 
390
391      
392     /* restore poly vertex(monomer) list*/
393     for(i=0;i<vesicle->filament_list->n;i++){
394         for(j=0;j<vesicle->filament_list->poly[i]->vlist->n;j++){
395             retval=fread(vesicle->filament_list->poly[i]->vlist->vtx[j],sizeof(ts_vertex),1,fh);
396                 
397             /* restore neigh and bonds */
398             vesicle->filament_list->poly[i]->vlist->vtx[j]->neigh=(ts_vertex **)calloc(vesicle->filament_list->poly[i]->vlist->vtx[j]->neigh_no, sizeof(ts_vertex *));
399             for(k=0;k<vesicle->filament_list->poly[i]->vlist->vtx[j]->neigh_no;k++){
400                 retval=fread(&idx,sizeof(ts_uint),1,fh);
401                 vesicle->filament_list->poly[i]->vlist->vtx[j]->neigh[k]=vesicle->filament_list->poly[i]->vlist->vtx[idx];
402             }
403             vesicle->filament_list->poly[i]->vlist->vtx[j]->bond=(ts_bond **)calloc(vesicle->filament_list->poly[i]->vlist->vtx[j]->bond_no, sizeof(ts_bond *));
404             for(k=0;k<vesicle->filament_list->poly[i]->vlist->vtx[j]->bond_no;k++){
405                 retval=fread(&idx,sizeof(ts_uint),1,fh);
406                 vesicle->filament_list->poly[i]->vlist->vtx[j]->bond[k]=vesicle->filament_list->poly[i]->blist->bond[idx];
407             }
408
409         }
410     }
411
412     /* restore poly bonds between monomers list*/
413     for(i=0;i<vesicle->filament_list->n;i++){
414         for(j=0;j<vesicle->filament_list->poly[i]->blist->n;j++){
415        //     vesicle->poly_list->poly[i]->blist->bond[j]=(ts_bond *)malloc(sizeof(ts_bond));
416             retval=fread(vesicle->filament_list->poly[i]->blist->bond[j],sizeof(ts_bond),1,fh);
417             /* restore vtx1 and vtx2 */
418                 retval=fread(&idx,sizeof(ts_uint),1,fh);
419                 vesicle->filament_list->poly[i]->blist->bond[j]->vtx1=vesicle->filament_list->poly[i]->vlist->vtx[idx];
420                 retval=fread(&idx,sizeof(ts_uint),1,fh);
421                 vesicle->filament_list->poly[i]->blist->bond[j]->vtx2=vesicle->filament_list->poly[i]->vlist->vtx[idx];
422         }
423     }
267db5 424     vesicle->tape=parsetape(command_line_args.tape_fullfilename);
063289 425 // recreating space for cells // 
055dd7 426     vesicle->clist=init_cell_list(vesicle->tape->ncxmax, vesicle->tape->ncymax, vesicle->tape->nczmax, vesicle->tape->stepsize);
2a1e3d 427 //THIS IS HARDCODED IN CELL.C NOW
SP 428 //    vesicle->clist->max_occupancy=16;
47a7ac 429 //    vesicle->tape=(ts_tape *)malloc(sizeof(ts_tape));
SP 430 //    retval=fread(vesicle->tape, sizeof(ts_tape),1,fh);
1ab449 431     retval=fread(iteration,sizeof(ts_uint),1,fh);
e9eab4 432     if(retval); 
SP 433     fclose(fh);
434     return vesicle;
435 }
436
437
438
083e03 439 ts_bool parse_args(int argc, char **argv){
3f5c83 440     int c, retval;
SP 441     struct stat sb;
442     sprintf(command_line_args.path, "./"); //clear string;
7b0c07 443     sprintf(command_line_args.output_fullfilename,"output.pvd");
SP 444     sprintf(command_line_args.dump_fullfilename,"dump.bin");
445     sprintf(command_line_args.tape_fullfilename,"tape");
1bf3c3 446     sprintf(command_line_args.tape_templatefull,"./tape");
3f5c83 447             FILE *file;
SP 448     
083e03 449 while (1)
SP 450      {
451        static struct option long_options[] =
452          {
8a6614 453            {"force-from-tape", no_argument,       &(command_line_args.force_from_tape), 1},
SP 454        {"reset-iteration-count", no_argument, &(command_line_args.reset_iteration_count), 1},
083e03 455            {"tape",     no_argument,       0, 't'},
fd8126 456        {"version", no_argument, 0, 'v'},
083e03 457            {"output-file",  required_argument, 0, 'o'},
SP 458            {"directory",  required_argument, 0, 'd'},
3f5c83 459            {"dump-filename", required_argument,0, 'f'},
7b0c07 460            {"tape-options",required_argument,0,'c'},
1bf3c3 461            {"tape-template", required_argument,0,0},
ab798b 462             {"restore-from-vtk",required_argument,0,0},
083e03 463            {0, 0, 0, 0}
SP 464          };
465        /* getopt_long stores the option index here. */
466        int option_index = 0;
467
fd8126 468        c = getopt_long (argc, argv, "d:f:o:t:c:v",
083e03 469                         long_options, &option_index);
SP 470
471        /* Detect the end of the options. */
472        if (c == -1)
473          break;
474
475        switch (c)
476          {
477          case 0:
478            /* If this option set a flag, do nothing else now. */
479            if (long_options[option_index].flag != 0)
480              break;
1bf3c3 481 /*           printf ("option %s", long_options[option_index].name);
083e03 482            if (optarg)
1bf3c3 483              printf (" with arg %s", optarg); 
SP 484            printf ("\n"); */
485             //TODO: find a better way.
486             if(strcmp(long_options[option_index].name,"tape-template")==0){
487                 strcpy(command_line_args.tape_templatefull,optarg);
488             }
ab798b 489             if(strcmp(long_options[option_index].name,"restore-from-vtk")==0){
ee84bd 490                 strcpy(command_line_args.dump_from_vtk,optarg);
SP 491             }
083e03 492            break;
fd8126 493      case 'v':
SP 494         fprintf(stdout,"TRISURF-NG v. %s, compiled on: %s %s.\n", TS_VERSION, __DATE__, __TIME__);
495             fprintf(stdout,"Programming done by: Samo Penic and Miha Fosnaric\n");
496             fprintf(stdout,"Released under terms of GPLv3\n");
497         exit(0);
083e03 498
7b0c07 499          case 'c':
SP 500               strcpy(command_line_args.tape_opts,optarg);
501             break;
502          case 't': //tape
3f5c83 503                 strcpy(command_line_args.tape_fullfilename,optarg);
083e03 504            break;
SP 505
7b0c07 506          case 'o':  //set filename of master pvd output file
3f5c83 507             strcpy(command_line_args.output_fullfilename, optarg);
SP 508             break;
083e03 509
SP 510          case 'd':
511             //check if directory exists. If not create one. If creation is
512             //successful, set directory for output files.
513             //printf ("option -d with value `%s'\n", optarg);
3f5c83 514             if (stat(optarg, &sb) == -1) {
SP 515                 //directory does not exist
083e03 516                 retval=mkdir(optarg, 0700);
SP 517                 if(retval){
3f5c83 518                     fatal("Could not create requested directory. Check if you have permissions",1);
083e03 519                 }
SP 520             }
3f5c83 521             //check if is a proper directory
SP 522             else if((sb.st_mode & S_IFMT) != S_IFDIR) {
523                 //it is not a directory. fatal error.
524                 ts_fprintf(stderr,"%s is not a directory!\n",optarg);
525                 fatal("Cannot continue",1);
083e03 526             }
3f5c83 527             strcpy(command_line_args.path, optarg);
083e03 528            break;
SP 529
530         case 'f':
3f5c83 531             strcpy(command_line_args.dump_fullfilename, optarg);
083e03 532             break;
SP 533
534          case '?':
535            /* getopt_long already printed an error message. */
ba73ab 536             print_help(stdout);
SP 537 //ts_fprintf(stderr,"\n\nhere comes the help.\n\n");
083e03 538             fatal("Ooops, read help first",1);
SP 539            break;
540
541          default:
542            exit (1);
543          }
544      }
545
7b0c07 546 //Here we set correct values for full filenames!
SP 547     char *buffer=(char *)malloc(10000*sizeof(char));
548     //correct the path and add trailing /
549     if(command_line_args.path[strlen(command_line_args.path)-1]!='/') strcat(command_line_args.path,"/");
550    
551 /* master pvd output file */ 
552     strcpy(buffer,command_line_args.path);
553     strcat(buffer,command_line_args.output_fullfilename);
554     if ((file = fopen(buffer, "w")) == NULL) {
555                 fprintf(stderr,"Could not create output file %s!\n", buffer);
556                 fatal("Please specify correct output file or check permissions of the file",1);
1bf3c3 557                 //there is a tape template. make a copy into desired directory
7b0c07 558                 
SP 559             } else {
560                 fclose(file);
561                 strcpy(command_line_args.output_fullfilename,buffer);
562             }
563
564 /* tape file */
565     strcpy(buffer,command_line_args.path);
566     strcat(buffer,command_line_args.tape_fullfilename);
567     if (stat(buffer, &sb) == -1) {
1bf3c3 568
SP 569                 //tape does not exist. does tape template exist?
570                 if(stat(command_line_args.tape_templatefull, &sb)==-1){ 
571                     ts_fprintf(stderr,"Tape '%s' does not exist and no tape template was specified (or does not exist)!\n",buffer);
572                     fatal("Please select correct tape or check permissions of the file",1);
573                 } else {
574                     //tape template found
575                     fatal("Samo did not program template copy yet",1); 
576                 }
7b0c07 577             } else {
SP 578                 strcpy(command_line_args.tape_fullfilename,buffer);
579             }
580
581
582 /* dump file */
583             strcpy(buffer,command_line_args.path);
584             strcat(buffer,command_line_args.dump_fullfilename);
585             //check if dump file exist first.
586             if (stat(buffer, &sb) == -1) {
587                 //no dump file. check if we can create one.
588                 if ((file = fopen(buffer, "w")) == NULL) {
589                     fprintf(stderr,"Could not create dump file '%s'!\n",buffer);
590                     fatal("Please specify correct dump file or check permissions of the file",1);
591                 } else {
592                     fclose(file);
593                     //good, file is writeable. delete it for now.
594                     remove(buffer);
595                 }
596             }
597             strcpy(command_line_args.dump_fullfilename, buffer);
598
599
600     free(buffer);
083e03 601     return TS_SUCCESS;
SP 602
603 }
604
605
ba73ab 606 ts_bool print_help(FILE *fd){
SP 607     fprintf(fd,"TRISURF-NG v. %s, compiled on: %s %s.\n", TS_VERSION, __DATE__, __TIME__);
608     fprintf(fd,"Programming done by: Samo Penic and Miha Fosnaric\n");
609     fprintf(fd,"Released under terms of GPLv3\n\n");
610
611     fprintf(fd, "Invoking trisurf-ng without any flags results in default operation. Program reads 'tape' file and 'dump.bin' binary representation of the vesicle from disk and continues the simulation where it was aborted (as specified in 'dump.bin').\n\n");
612     fprintf(fd,"If 'tape' has different values than binary dump, those are used (if possible -- some values in tape, such as nshell cannot be modified).\n\n\n");
613     fprintf(fd,"However, if dump.bin is not present, user is notified to specify --force-from-tape flag. The vesicle will be created from specifications in tape.\n\n\n");
614     fprintf(fd,"Flags:\n\n");
615     fprintf(fd,"--force-from-tape\t\t makes initial shape of the vesicle from tape. Ignores already existing binary dump and possible simulation results.\n");
616     fprintf(fd,"--restore-from-vtk\t\t VTK's file ending with '.vtu' are preferred way to make state snapshots for restoration. With this flag the restoration of the vesicle from vtk is possible. The simulation will continue if hidden '.status' file with last iteration done is present. Otherwise it will start simulation from timestep 0.\n");
c4178c 617     fprintf(fd,"--reset-iteration-count\t\t starts simulation from the beginning (using binary dump).\n");
ba73ab 618     fprintf(fd,"--tape (or -t)\t\t specifies tape filename. For --force-from-tape and restoring from binary dump. Defaults to 'tape'.\n");
SP 619     fprintf(fd,"--version (or -v)\t\t Prints version information.\n");
620     fprintf(fd,"--output-file (or -o)\t\t Specifies filename of .PVD file. Defaults to 'output.pvd'\n");
c4178c 621     fprintf(fd,"--dump-filename (or -f)\t\t specifies filename for binary dump&restore. Defaults to 'dump.bin'\n\n\n");
SP 622     fprintf(fd,"Examples:\n\n");
623     fprintf(fd,"trisurf --force-from-tape\n");
624     fprintf(fd,"trisurf --reset-iteration-count\n");
625     fprintf(fd,"trisurf --restore-from-vtk filename.vtu\n");
626     fprintf(fd,"\n\n");
627
ba73ab 628     return TS_SUCCESS;
SP 629 }
630
631
083e03 632
d7639a 633 ts_bool print_vertex_list(ts_vertex_list *vlist){
SP 634     ts_uint i;
635     printf("Number of vertices: %u\n",vlist->n);
636     for(i=0;i<vlist->n;i++){
a6b1b5 637         printf("%u: %f %f %f\n",
8f6a69 638 vlist->vtx[i]->idx,vlist->vtx[i]->x, vlist->vtx[i]->y, vlist->vtx[i]->z);
d7639a 639     }
SP 640     return TS_SUCCESS;
641 }
642
643 ts_bool print_vertex_neighbours(ts_vertex_list *vlist){
644     ts_uint i,j;
a6b1b5 645     ts_vertex **vtx=vlist->vtx;
d7639a 646     printf("Vertex id(neigh no): (neighvertex coord) (neighvertex coord) ...\n");
SP 647     for(i=0;i<vlist->n;i++){
8f6a69 648         printf("%u(%u): ",vtx[i]->idx,vtx[i]->neigh_no);
SP 649         for(j=0;j<vtx[i]->neigh_no;j++){
650             printf("(%f,%f,%f)",vtx[i]->neigh[j]->x,
651 vtx[i]->neigh[j]->y,vtx[i]->neigh[j]->z);
d7639a 652         }
SP 653         printf("\n");
654     }
655
656 return TS_SUCCESS;
657 }
658
659 ts_bool write_vertex_fcompat_file(ts_vertex_list *vlist,ts_char *filename){
a6b1b5 660     ts_vertex **vtx=vlist->vtx;
d7639a 661     ts_uint i;
SP 662     FILE *fh;
663     
664     fh=fopen(filename, "w");
665     if(fh==NULL){
666         err("Cannot open file %s for writing");
667         return TS_FAIL;
668     }
669     for(i=0;i<vlist->n;i++)
8f6a69 670         fprintf(fh," %E\t%E\t%E\n",vtx[i]->x,vtx[i]->y, vtx[i]->z);
d7639a 671
SP 672     fclose(fh);
673 return TS_SUCCESS;
674 }
675
676
677 ts_bool fprint_vertex_list(FILE *fh,ts_vertex_list *vlist){
678     ts_uint i,j;
679     for(i=0;i<vlist->n;i++){
8f6a69 680         fprintf(fh," %.17E\t%.17E\t%.17E\t%u\n",vlist->vtx[i]->x,
SP 681             vlist->vtx[i]->y, vlist->vtx[i]->z,
682             vlist->vtx[i]->neigh_no);
683         for(j=0;j<vlist->vtx[i]->neigh_no;j++){
684             fprintf(fh,"\t%u",(ts_uint)(vlist->vtx[i]->neigh[j]->idx));
a6b1b5 685         //-vlist->vtx+1));
d7639a 686         }
SP 687         fprintf(fh,"\n");
688     }
689     return TS_SUCCESS;
690 }
691
692 ts_bool fprint_tristar(FILE *fh, ts_vesicle *vesicle){
693     ts_uint i,j;
a6b1b5 694     for(i=0;i<vesicle->vlist->n;i++){
8f6a69 695         fprintf(fh,"\t%u",vesicle->vlist->vtx[i]->tristar_no);
SP 696         for(j=0;j<vesicle->vlist->vtx[i]->tristar_no;j++){
697             fprintf(fh,"\t%u",(ts_uint)(vesicle->vlist->vtx[i]->tristar[j]->idx));//-vesicle->tlist->tria+1));
d7639a 698         }
SP 699         fprintf(fh,"\n");
700     }
701     return TS_SUCCESS;
702 }
703
704 ts_bool fprint_triangle_list(FILE *fh, ts_vesicle *vesicle){
a6b1b5 705         ts_triangle_list *tlist=vesicle->tlist;
d7639a 706       ts_uint i,j;
SP 707     for(i=0;i<tlist->n;i++){
41a035 708         fprintf(fh,"\t%u",tlist->tria[i]->neigh_no);
SP 709         for(j=0;j<tlist->tria[i]->neigh_no;j++){
710             fprintf(fh,"\t%u",(ts_uint)(tlist->tria[i]->neigh[j]->idx));//-tlist->tria+1)); 
d7639a 711         }
SP 712         fprintf(fh,"\n");
713             for(j=0;j<3;j++){
41a035 714             fprintf(fh,"\t%u",(ts_uint)(tlist->tria[i]->vertex[j]->idx));//-vesicle->vlist->vtx+1)); 
d7639a 715             }
SP 716         fprintf(fh,"\n");
41a035 717         fprintf(fh,"%.17E\t%.17E\t%.17E\n",tlist->tria[i]->xnorm,
SP 718 tlist->tria[i]->ynorm,tlist->tria[i]->znorm);
d7639a 719         fprintf(fh,"0.00000000000000000\n0.00000000000000000\n");
SP 720     }
721     return TS_SUCCESS;
722 }
723
724 ts_bool fprint_vertex_data(FILE *fh,ts_vertex_list *vlist){
725     ts_uint i,j;
726     for(i=0;i<vlist->n;i++){
727         fprintf(fh," %.17E\t%.17E\t%.17E\t%.17E\t%.17E\t%u\n",
8f6a69 728         vlist->vtx[i]->xk,vlist->vtx[i]->c,vlist->vtx[i]->energy,
SP 729         vlist->vtx[i]->energy_h, vlist->vtx[i]->curvature, 0);
cef6ca 730         for(j=0;j<vlist->vtx[i]->bond_no;j++){
8f6a69 731             fprintf(fh," %.17E", vlist->vtx[i]->bond[j]->bond_length_dual);
d7639a 732         }
SP 733             fprintf(fh,"\n");
cef6ca 734         for(j=0;j<vlist->vtx[i]->bond_no;j++){
8f6a69 735             fprintf(fh," %.17E", vlist->vtx[i]->bond[j]->bond_length);
d7639a 736         }
SP 737             fprintf(fh,"\n");
738     }
739     return TS_SUCCESS;
740 }
741
742 ts_bool fprint_bonds(FILE *fh,ts_vesicle *vesicle){
743     ts_uint i;
a6b1b5 744     for(i=0;i<vesicle->blist->n;i++){
e016c4 745         fprintf(fh,"\t%u\t%u\n",(ts_uint)(vesicle->blist->bond[i]->vtx1->idx),
a6b1b5 746 //-vesicle->vlist->vtx+1),
e016c4 747         (ts_uint)(vesicle->blist->bond[i]->vtx2->idx));
a6b1b5 748     //-vesicle->vlist.vtx+1));
d7639a 749     }
SP 750     return TS_SUCCESS;
751 }
752
753
754
755 ts_bool read_tape_fcompat_file(ts_vesicle *vesicle, ts_char *filename){
756     FILE *fh;
757     char line[255];
758     fh=fopen(filename, "r");
759         if(fh==NULL){
760                 err("Cannot open file for reading... Nonexistant file?");
761                 return TS_FAIL;
762         }
a6b1b5 763     ts_uint retval=1;
d7639a 764     while(retval!=EOF){
SP 765         retval=fscanf(fh,"%s",line);
766         
767         fprintf(stderr,"%s",line);
768     }    
769     fclose(fh);    
770     return TS_SUCCESS;
771 }
772
773 ts_bool write_master_xml_file(ts_char *filename){
774      FILE *fh;
775     ts_char *i,*j;
776     ts_uint tstep;
777     ts_char *number;
778         fh=fopen(filename, "w");
779         if(fh==NULL){
780                 err("Cannot open file %s for writing");
781                 return TS_FAIL;
782         }
783
784     fprintf(fh,"<?xml version=\"1.0\"?>\n<VTKFile type=\"Collection\" version=\"0.1\" byte_order=\"LittleEndian\" compressor=\"vtkZLibDataCompressor\">\n<Collection>");
267db5 785     DIR *dir = opendir(command_line_args.path);
d7639a 786     if(dir){
SP 787         struct dirent *ent;
788         tstep=0;
789         while((ent = readdir(dir)) != NULL)
790         {
791             i=rindex(ent->d_name,'.');
792             if(i==NULL) continue;
793             if(strcmp(i+1,"vtu")==0){
794                     j=rindex(ent->d_name,'_');
795                     if(j==NULL) continue;
796                     number=strndup(j+1,j-i); 
a6b1b5 797                 fprintf(fh,"<DataSet timestep=\"%u\" group=\"\" part=\"0\" file=\"%s\"/>\n",atoi(number),ent->d_name);
d7639a 798                 tstep++;
SP 799                     free(number);
800             }  
801         }
802     }
f74313 803     free(dir);
d7639a 804     fprintf(fh,"</Collection>\n</VTKFile>\n");
SP 805     fclose(fh);
806     return TS_SUCCESS;
807 }
808
0a2c81 809 ts_bool write_vertex_xml_file(ts_vesicle *vesicle, ts_uint timestepno, ts_cluster_list *cstlist){
a6b1b5 810     ts_vertex_list *vlist=vesicle->vlist;
SP 811     ts_bond_list *blist=vesicle->blist;
812     ts_vertex **vtx=vlist->vtx;
40aa5b 813     ts_uint i,j;
13d445 814     //ts_double senergy=0.0;
267db5 815         char filename[10000];
SP 816         char just_name[255];
d7639a 817     FILE *fh;
267db5 818         strcpy(filename,command_line_args.path);
SP 819         sprintf(just_name,"timestep_%.6u.vtu",timestepno);
820         strcat(filename,just_name);
d7639a 821
SP 822     fh=fopen(filename, "w");
823     if(fh==NULL){
824         err("Cannot open file %s for writing");
825         return TS_FAIL;
826     }
827     /* Here comes header of the file */
40aa5b 828
SP 829     //find number of extra vtxs and bonds of polymeres
58230a 830     ts_uint monono=0, polyno=0, poly_idx=0, filno=0, fonono=0;
M 831     ts_bool poly=0, fil=0;
40aa5b 832     if(vesicle->poly_list!=NULL){
2a1e3d 833         if(vesicle->poly_list->n!=0){
SP 834         //if(vesicle->poly_list->poly[0]!=NULL){
40aa5b 835         polyno=vesicle->poly_list->n;
SP 836         monono=vesicle->poly_list->poly[0]->vlist->n;
837         poly=1;
838         }
839     }
58230a 840
M 841     if(vesicle->filament_list!=NULL){
2a1e3d 842         if(vesicle->filament_list->n!=0){
SP 843         //if(vesicle->filament_list->poly[0]!=NULL){
58230a 844         filno=vesicle->filament_list->n;
M 845         fonono=vesicle->filament_list->poly[0]->vlist->n;
846         fil=1;
847         }
848     }
849
854cb6 850     fprintf(fh, "<?xml version=\"1.0\"?>\n<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\" compressor=\"vtkZLibDataCompressor\">\n");
SP 851     xml_trisurf_data(fh,vesicle);
852     fprintf(fh, " <UnstructuredGrid>\n");
8db203 853     fprintf(fh, "<Piece NumberOfPoints=\"%u\" NumberOfCells=\"%u\">\n",vlist->n+monono*polyno+fonono*filno, blist->n+monono*polyno+filno*(fonono-1)+vesicle->tlist->n);
5c64e2 854     fprintf(fh,"<PointData Scalars=\"vertices_idx\">\n<DataArray type=\"Int64\" Name=\"vertices_idx\" format=\"ascii\">");
d7639a 855        for(i=0;i<vlist->n;i++){
a6b1b5 856         fprintf(fh,"%u ",vtx[i]->idx);
d7639a 857     }
40aa5b 858     //polymeres
SP 859     if(poly){
3c1ac1 860         poly_idx=vlist->n;
40aa5b 861         for(i=0;i<vesicle->poly_list->n;i++){
3c1ac1 862             for(j=0;j<vesicle->poly_list->poly[i]->vlist->n;j++,poly_idx++){
58230a 863                 fprintf(fh,"%u ", poly_idx);
M 864             }
865         }
866     }
867     //filaments
868     if(fil){
869         poly_idx=vlist->n+monono*polyno;
870         for(i=0;i<vesicle->filament_list->n;i++){
871             for(j=0;j<vesicle->filament_list->poly[i]->vlist->n;j++,poly_idx++){
872     //    fprintf(stderr,"was here\n");
3c1ac1 873                 fprintf(fh,"%u ", poly_idx);
40aa5b 874             }
SP 875         }
876     }
d7639a 877
45c708 878         fprintf(fh,"</DataArray>\n");
0a2c81 879     if(cstlist!=NULL){
SP 880         fprintf(fh,"<DataArray type=\"Int64\" Name=\"vertices_in_cluster\" format=\"ascii\">");
881         for(i=0;i<vlist->n;i++){
882             if(vtx[i]->cluster!=NULL){
883                 fprintf(fh,"%u ",vtx[i]->cluster->nvtx);
884             } else {
885                 fprintf(fh,"-1 ");
886             }
887             }
888         //polymeres
889         if(poly){
890             poly_idx=vlist->n;
891             for(i=0;i<vesicle->poly_list->n;i++){
892                 for(j=0;j<vesicle->poly_list->poly[i]->vlist->n;j++,poly_idx++){
893                     fprintf(fh,"-1 ");
894                 }
895             }
896         }
897         //filaments
898         if(fil){
899             poly_idx=vlist->n+monono*polyno;
900             for(i=0;i<vesicle->filament_list->n;i++){
901                 for(j=0;j<vesicle->filament_list->poly[i]->vlist->n;j++,poly_idx++){
902         //    fprintf(stderr,"was here\n");
903                     fprintf(fh,"-1 ");
904                 }
905             }
906         }
907
908         fprintf(fh,"</DataArray>\n");
909
910
911     }
912
45c708 913     //here comes additional data as needed. Currently only spontaneous curvature
SP 914     fprintf(fh,"<DataArray type=\"Float64\" Name=\"spontaneous_curvature\" format=\"ascii\">");
915     for(i=0;i<vlist->n;i++){
916         fprintf(fh,"%.17e ",vtx[i]->c);
917     }
918         //polymeres
919         if(poly){
920             poly_idx=vlist->n;
921             for(i=0;i<vesicle->poly_list->n;i++){
922                 for(j=0;j<vesicle->poly_list->poly[i]->vlist->n;j++,poly_idx++){
923                     fprintf(fh,"%.17e ", vesicle->poly_list->poly[i]->vlist->vtx[j]->c);
924                 }
925             }
926         }
927         //filaments
928         if(fil){
929             poly_idx=vlist->n+monono*polyno;
930             for(i=0;i<vesicle->filament_list->n;i++){
931                 for(j=0;j<vesicle->filament_list->poly[i]->vlist->n;j++,poly_idx++){
932         //    fprintf(stderr,"was here\n");
933                     fprintf(fh,"%.17e ",  vesicle->filament_list->poly[i]->vlist->vtx[j]->c);
934                 }
935             }
936         }
937     fprintf(fh,"</DataArray>\n");
938
5c64e2 939     //here comes additional data. Energy!
SP 940     fprintf(fh,"<DataArray type=\"Float64\" Name=\"bending_energy\" format=\"ascii\">");
941     for(i=0;i<vlist->n;i++){
942         fprintf(fh,"%.17e ",vtx[i]->energy*vtx[i]->xk);
943     }
944         //polymeres
945         if(poly){
946             poly_idx=vlist->n;
947             for(i=0;i<vesicle->poly_list->n;i++){
948                 for(j=0;j<vesicle->poly_list->poly[i]->vlist->n;j++,poly_idx++){
949                     fprintf(fh,"%.17e ", vesicle->poly_list->poly[i]->vlist->vtx[j]->energy* vesicle->poly_list->poly[i]->k);
950                 }
951             }
952         }
953         //filaments
954         if(fil){
955             poly_idx=vlist->n+monono*polyno;
956             for(i=0;i<vesicle->filament_list->n;i++){
957                 for(j=0;j<vesicle->filament_list->poly[i]->vlist->n;j++,poly_idx++){
958         //    fprintf(stderr,"was here\n");
959                     fprintf(fh,"%.17e ",  vesicle->filament_list->poly[i]->vlist->vtx[j]->energy*  vesicle->filament_list->poly[i]->k);
960                 }
961             }
962         }
963     fprintf(fh,"</DataArray>\n");
964
45c708 965     
13d445 966     fprintf(fh,"</PointData>\n<CellData>\n");
SP 967
7ec6fb 968     if(vesicle->tape->stretchswitch==1){
SP 969         fprintf(fh,"<DataArray type=\"Float64\" Name=\"stretching_energy\" format=\"ascii\">");
cf7aba 970         for(i=0;i<blist->n;i++){
SP 971             fprintf(fh, "0.0 ");
972         }
973         for(i=0;i<monono*polyno+filno*(fonono-1);i++){
13d445 974             fprintf(fh,"0.0 ");
7ec6fb 975         }
13d445 976         for(i=0;i<vesicle->tlist->n;i++){
SP 977             fprintf(fh,"%.17e ",vesicle->tlist->tria[i]->energy);
978         }
7ec6fb 979         fprintf(fh,"</DataArray>\n");
SP 980     }
45c708 981
13d445 982
SP 983
984     fprintf(fh,"</CellData>\n<Points>\n<DataArray type=\"Float64\" Name=\"Koordinate tock\" NumberOfComponents=\"3\" format=\"ascii\">\n");
d7639a 985     for(i=0;i<vlist->n;i++){
aad500 986         fprintf(fh,"%.17e %.17e %.17e\n",vtx[i]->x,vtx[i]->y, vtx[i]->z);
40aa5b 987     }
SP 988     //polymeres
989     if(poly){
990         for(i=0;i<vesicle->poly_list->n;i++){
991             for(j=0;j<vesicle->poly_list->poly[i]->vlist->n;j++){
aad500 992                 fprintf(fh,"%.17e %.17e %.17e\n", vesicle->poly_list->poly[i]->vlist->vtx[j]->x,vesicle->poly_list->poly[i]->vlist->vtx[j]->y, vesicle->poly_list->poly[i]->vlist->vtx[j]->z );
58230a 993             }
M 994         }
995     }
996     //filaments
997     if(fil){
998         for(i=0;i<vesicle->filament_list->n;i++){
999             for(j=0;j<vesicle->filament_list->poly[i]->vlist->n;j++){
aad500 1000                 fprintf(fh,"%.17e %.17e %.17e\n", vesicle->filament_list->poly[i]->vlist->vtx[j]->x,vesicle->filament_list->poly[i]->vlist->vtx[j]->y, vesicle->filament_list->poly[i]->vlist->vtx[j]->z );
40aa5b 1001             }
SP 1002         }
d7639a 1003     }
SP 1004
1005     fprintf(fh,"</DataArray>\n</Points>\n<Cells>\n<DataArray type=\"Int64\" Name=\"connectivity\" format=\"ascii\">");
1006     for(i=0;i<blist->n;i++){
e016c4 1007             fprintf(fh,"%u %u\n",blist->bond[i]->vtx1->idx,blist->bond[i]->vtx2->idx);
d7639a 1008     }
40aa5b 1009     //polymeres
SP 1010     if(poly){
3c1ac1 1011         poly_idx=vlist->n;
40aa5b 1012         for(i=0;i<vesicle->poly_list->n;i++){
SP 1013             for(j=0;j<vesicle->poly_list->poly[i]->blist->n;j++){
3c1ac1 1014 //                fprintf(fh,"%u %u\n", vesicle->poly_list->poly[i]->blist->bond[j]->vtx1->idx,vesicle->poly_list->poly[i]->blist->bond[j]->vtx2->idx);
SP 1015                 fprintf(fh,"%u %u\n", vesicle->poly_list->poly[i]->blist->bond[j]->vtx1->idx+vlist->n+i*monono,vesicle->poly_list->poly[i]->blist->bond[j]->vtx2->idx+vlist->n+i*monono);
40aa5b 1016             }
SP 1017     //grafted bonds
3c1ac1 1018         fprintf(fh,"%u %u\n", vesicle->poly_list->poly[i]->grafted_vtx->idx, vesicle->poly_list->poly[i]->vlist->vtx[0]->idx+vlist->n+i*monono);
40aa5b 1019         }
SP 1020
1021     }
1022     
58230a 1023     //filaments
M 1024     if(fil){
1025         poly_idx=vlist->n+monono*polyno;
1026         for(i=0;i<vesicle->filament_list->n;i++){
1027             for(j=0;j<vesicle->filament_list->poly[i]->blist->n;j++){
1028                 fprintf(fh,"%u %u\n", vesicle->filament_list->poly[i]->blist->bond[j]->vtx1->idx+vlist->n+monono*polyno+i*fonono,vesicle->filament_list->poly[i]->blist->bond[j]->vtx2->idx+vlist->n+monono*polyno+i*fonono);
1029 //        fprintf(stderr,"was here\n");
1030             
1031             }
1032         }
1033
1034     }
8db203 1035     for(i=0;i<vesicle->tlist->n;i++){
SP 1036         fprintf(fh,"%u %u %u\n", vesicle->tlist->tria[i]->vertex[0]->idx, vesicle->tlist->tria[i]->vertex[1]->idx, vesicle->tlist->tria[i]->vertex[2]->idx);
1037     }
d7639a 1038     fprintf(fh,"</DataArray>\n<DataArray type=\"Int64\" Name=\"offsets\" format=\"ascii\">");
58230a 1039     for (i=2;i<(blist->n+monono*polyno+(fonono-1)*filno)*2+1;i+=2){
d7639a 1040     fprintf(fh,"%u ",i);
SP 1041     }
8db203 1042     for(j=i+1;j<i+3*(vesicle->tlist->n);j+=3){ //let's continue counting from where we left of
SP 1043         fprintf(fh,"%u ", j);
1044     }
d7639a 1045     fprintf(fh,"\n");
SP 1046     fprintf(fh,"</DataArray>\n<DataArray type=\"UInt8\" Name=\"types\" format=\"ascii\">\n");
8db203 1047      for (i=0;i<blist->n+monono*polyno+(fonono-1)*filno;i++){
d7639a 1048         fprintf(fh,"3 ");
SP 1049     }
8db203 1050     for(i=0;i<vesicle->tlist->n;i++){
SP 1051         fprintf(fh,"5 ");
1052     }
d7639a 1053     fprintf(fh,"</DataArray>\n</Cells>\n</Piece>\n</UnstructuredGrid>\n</VTKFile>\n");
SP 1054     fclose(fh);
1055     return TS_SUCCESS;
1056
1057 }
1058
1059 ts_bool write_vertex_vtk_file(ts_vesicle *vesicle,ts_char *filename, ts_char *text){
a6b1b5 1060     ts_vertex_list *vlist=vesicle->vlist;
SP 1061     ts_bond_list *blist=vesicle->blist;
1062     ts_vertex **vtx=vlist->vtx;
1063     ts_uint i;
d7639a 1064     FILE *fh;
SP 1065     
1066     fh=fopen(filename, "w");
1067     if(fh==NULL){
1068         err("Cannot open file %s for writing");
1069         return TS_FAIL;
1070     }
1071     /* Here comes header of the file */
1072 //    fprintf(stderr,"NSHELL=%u\n",nshell);
1073     fprintf(fh, "# vtk DataFile Version 2.0\n");
1074     /* TODO: Do a sanity check on text. Max 255 char, must not me \n terminated */ 
1075     fprintf(fh, "%s\n", text);
1076     fprintf(fh,"ASCII\n");
1077     fprintf(fh,"DATASET UNSTRUCTURED_GRID\n");
1078     fprintf(fh,"POINTS %u double\n", vlist->n);
1079     for(i=0;i<vlist->n;i++){
8f6a69 1080         fprintf(fh,"%e %e %e\n",vtx[i]->x,vtx[i]->y, vtx[i]->z);
d7639a 1081     }
SP 1082     
1083     fprintf(fh,"CELLS %u %u\n",blist->n,3*blist->n);
1084     for(i=0;i<blist->n;i++){
e016c4 1085             fprintf(fh,"2 %u %u\n",blist->bond[i]->vtx1->idx,blist->bond[i]->vtx2->idx);
d7639a 1086     }
SP 1087     fprintf(fh,"CELL_TYPES %u\n",blist->n);
1088     for(i=0;i<blist->n;i++)
1089         fprintf(fh,"3\n");
1090
1091     fprintf(fh,"POINT_DATA %u\n", vlist->n);
1092     fprintf(fh,"SCALARS scalars long 1\n");
1093     fprintf(fh,"LOOKUP_TABLE default\n");
1094
1095     for(i=0;i<vlist->n;i++)
8f6a69 1096         fprintf(fh,"%u\n",vtx[i]->idx);
d7639a 1097
SP 1098     fclose(fh);
1099     return TS_SUCCESS;
1100 }
1101
1102
1103
144784 1104 ts_bool write_pov_file(ts_vesicle *vesicle, char *filename){
SP 1105     FILE *fh;
1106     ts_uint i;
1107     
1108     fh=fopen(filename, "w");
1109     if(fh==NULL){
1110         err("Cannot open file %s for writing");
1111         return TS_FAIL;
1112     }
1113
1114     for(i=0;i<vesicle->tlist->n;i++){
1115     
1116     fprintf(fh,"\ttriangle {");
1117     fprintf(fh,"\t<%e,%e,%e> <%e,%e,%e> <%e,%e,%e> }\n", 
1118     vesicle->tlist->tria[i]->vertex[0]->x,
1119     vesicle->tlist->tria[i]->vertex[0]->y,
1120     vesicle->tlist->tria[i]->vertex[0]->z,
1121
1122     vesicle->tlist->tria[i]->vertex[1]->x,
1123     vesicle->tlist->tria[i]->vertex[1]->y,
1124     vesicle->tlist->tria[i]->vertex[1]->z,
1125
1126     vesicle->tlist->tria[i]->vertex[2]->x,
1127     vesicle->tlist->tria[i]->vertex[2]->y,
1128     vesicle->tlist->tria[i]->vertex[2]->z
1129     );
1130     }
1131         
1132     fclose(fh);
1133     return TS_SUCCESS;
1134 }
1135
1136
1ab449 1137 ts_tape *parsetape(char *filename){
698ae1 1138     FILE *fd = fopen (filename, "r");
SP 1139     long length;
1140     size_t size;
1141     fseek (fd, 0, SEEK_END);
1142       length = ftell (fd);
1143     fseek (fd, 0, SEEK_SET);
1144     size=fread (tapetxt, 1, length, fd);
1145     fclose(fd);
1146     if(size);
1147     ts_tape *tape=parsetapebuffer(tapetxt);
1148     return tape;
1149 }
1150
1151 ts_tape *parsetapebuffer(char *buffer){
1ab449 1152     ts_tape *tape=(ts_tape *)calloc(1,sizeof(ts_tape));
SP 1153     tape->multiprocessing=calloc(255,sizeof(char));
40aa5b 1154
d7639a 1155     cfg_opt_t opts[] = {
1ab449 1156         CFG_SIMPLE_INT("nshell", &tape->nshell),
SP 1157         CFG_SIMPLE_INT("npoly", &tape->npoly),
1158         CFG_SIMPLE_INT("nmono", &tape->nmono),
58230a 1159     CFG_SIMPLE_INT("nfil",&tape->nfil),
M 1160     CFG_SIMPLE_INT("nfono",&tape->nfono),
e98482 1161     CFG_SIMPLE_INT("internal_poly",&tape->internal_poly),
58230a 1162     CFG_SIMPLE_INT("R_nucleus",&tape->R_nucleus),
37791b 1163     CFG_SIMPLE_FLOAT("R_nucleusX",&tape->R_nucleusX),
SP 1164     CFG_SIMPLE_FLOAT("R_nucleusY",&tape->R_nucleusY),
1165     CFG_SIMPLE_FLOAT("R_nucleusZ",&tape->R_nucleusZ),
58230a 1166     CFG_SIMPLE_FLOAT("dmax", &tape->dmax),
ea1cce 1167     CFG_SIMPLE_FLOAT("dmin_interspecies", &tape->dmin_interspecies),
1ab449 1168         CFG_SIMPLE_FLOAT("xk0",&tape->xk0),
SP 1169     CFG_SIMPLE_INT("pswitch",&tape->pswitch),
9166cb 1170     CFG_SIMPLE_INT("constvolswitch",&tape->constvolswitch),
c0ae90 1171     CFG_SIMPLE_INT("constareaswitch",&tape->constareaswitch),
43c042 1172     CFG_SIMPLE_FLOAT("constvolprecision",&tape->constvolprecision),
2ae815 1173     CFG_SIMPLE_INT("stretchswitch",&tape->stretchswitch),
SP 1174     CFG_SIMPLE_FLOAT("xkA0",&tape->xkA0),    
1ab449 1175     CFG_SIMPLE_FLOAT("pressure",&tape->pressure),
SP 1176     CFG_SIMPLE_FLOAT("k_spring",&tape->kspring),
b30f45 1177     CFG_SIMPLE_FLOAT("xi",&tape->xi),
1ab449 1178         CFG_SIMPLE_FLOAT("stepsize",&tape->stepsize),
SP 1179         CFG_SIMPLE_INT("nxmax", &tape->ncxmax),
1180         CFG_SIMPLE_INT("nymax", &tape->ncymax),
1181         CFG_SIMPLE_INT("nzmax", &tape->nczmax),
1182         CFG_SIMPLE_INT("iterations",&tape->iterations),
1183     CFG_SIMPLE_INT("mcsweeps",&tape->mcsweeps),
1184     CFG_SIMPLE_INT("inititer", &tape->inititer),
819a09 1185                 CFG_SIMPLE_BOOL("quiet",(cfg_bool_t *)&tape->quiet),
S 1186         CFG_SIMPLE_STR("multiprocessing",&tape->multiprocessing),
1ab449 1187         CFG_SIMPLE_INT("smp_cores",&tape->brezveze0),
SP 1188         CFG_SIMPLE_INT("cluster_nodes",&tape->brezveze1),
1189         CFG_SIMPLE_INT("distributed_processes",&tape->brezveze2),
dc77e8 1190     CFG_SIMPLE_INT("spherical_harmonics_coefficients",&tape->shc),
e5858f 1191     CFG_SIMPLE_INT("number_of_vertices_with_c0", &tape->number_of_vertices_with_c0),
SP 1192     CFG_SIMPLE_FLOAT("c0",&tape->c0),
1193     CFG_SIMPLE_FLOAT("w",&tape->w),
250de4 1194     CFG_SIMPLE_FLOAT("F",&tape->F),
6c274d 1195 /* Variables related to plane confinement */
514ebc 1196     CFG_INT("plane_confinement_switch", 0, CFGF_NONE),
SP 1197     CFG_FLOAT("plane_d", 15, CFGF_NONE),
1198     CFG_FLOAT("plane_F", 1000, CFGF_NONE),
6c274d 1199 /* Variables related to stretching */
36bc6d 1200 //    CFG_FLOAT("stretchswitch", 0, CFGF_NONE),
SP 1201 //    CFG_FLOAT("xkA0",0,CFGF_NONE),
d7639a 1202         CFG_END()
SP 1203     };
1204     cfg_t *cfg;    
1205     ts_uint retval;
1206     cfg = cfg_init(opts, 0);
698ae1 1207     retval=cfg_parse_buf(cfg, buffer);
514ebc 1208     tape->plane_confinement_switch=cfg_getint(cfg,"plane_confinement_switch");
88bdd7 1209     tape->plane_d=cfg_getfloat(cfg,"plane_d");
SP 1210     tape->plane_F=cfg_getfloat(cfg,"plane_F");
514ebc 1211
d7639a 1212     if(retval==CFG_FILE_ERROR){
a6b1b5 1213     fatal("No tape file.",100);
d7639a 1214     }
SP 1215     else if(retval==CFG_PARSE_ERROR){
1216     fatal("Invalid tape!",100);
1217     }
a2db52 1218
7b0c07 1219     /* here we override all values read from tape with values from commandline*/
SP 1220     getcmdline_tape(cfg,command_line_args.tape_opts);
d7639a 1221     cfg_free(cfg);
40aa5b 1222
SP 1223
1ab449 1224     /* global variables are set automatically */
SP 1225     quiet=tape->quiet;
1226     return tape;
1227 }
d7639a 1228
1ab449 1229 ts_bool tape_free(ts_tape *tape){
SP 1230     free(tape->multiprocessing);
1231     free(tape);
1232     return TS_SUCCESS;
d7639a 1233 }
f74313 1234
SP 1235
7b0c07 1236
SP 1237 ts_bool getcmdline_tape(cfg_t *cfg, char *opts){
1238
1239     char *commands, *backup, *saveptr, *saveopptr, *command, *operator[2];
07e3de 1240     operator[0]=0;
SP 1241     operator[1]=0;
7b0c07 1242     ts_uint i,j;
SP 1243     commands=(char *)malloc(10000*sizeof(char));
1244     backup=commands; //since the pointer to commands will be lost, we acquire a pointer that will serve as backup.
1245     strcpy(commands,opts);
1246     for(i=0; ;i++, commands=NULL){
1247         //breaks comma separated list of commands into specific commands.
1248         command=strtok_r(commands,",",&saveptr);    
1249         if(command==NULL) break;
1250 //        fprintf(stdout,"Command %d: %s\n",i,command);    
1251         //extracts name of command and value of command into operator[2] array.
1252         for(j=0; j<2;j++,command=NULL){
1253             operator[j]=strtok_r(command,"=",&saveopptr);
1254             if(operator[j]==NULL) break;
1255 //            fprintf(stdout," ---> Operator %d: %s\n",j,operator[j]);        
1256         }
1257         //1. check: must have 2 operators.
1258         if(j!=2) fatal("Error. Command line tape options are not formatted properly",1);
1259
1260     //    cfg_setstr(cfg,operator[0],operator[1]);
1261         cmdline_to_tape(cfg,operator[0],operator[1]);
1262         //2. check: must be named properly.
1263         //3. check: must be of right format (integer, double, string, ...)
1264         
1265     }
1266     free(backup);
1267     return TS_SUCCESS;
1268 }
1269
1270
1271 ts_bool cmdline_to_tape(cfg_t *cfg, char *key, char *val){
1272
1273     cfg_opt_t *cfg_opt=cfg_getopt(cfg,key);
1274     if(cfg_opt==NULL) fatal("Commandline tape option not recognised",1); //return TS_FAIL; 
1275     switch (cfg_opt->type){
1276         case CFGT_INT:
1277             cfg_setint(cfg,key,atol(val));
1278             break;
1279         case CFGT_FLOAT:
1280             cfg_setfloat(cfg,key,atof(val));
1281             break;
1282 /*        case CFGT_BOOL:
1283             cfg_setbool(cfg,operator[0],operator[1]);
1284             break; */
1285         case CFGT_STR:
1286             cfg_setstr(cfg,key,val);
1287             break;
1288         default:
1289             break;
1290
1291     }
1292     return TS_SUCCESS;
1293 }
1294
1295
1296
f74313 1297 ts_bool read_geometry_file(char *fname, ts_vesicle *vesicle){
SP 1298     FILE *fh;
1299     ts_uint i, nvtx,nedges,ntria;
1300     ts_uint vtxi1,vtxi2;
1301     float x,y,z;
1302     ts_vertex_list *vlist;
1303     fh=fopen(fname, "r");
1304         if(fh==NULL){
1305                 err("Cannot open file for reading... Nonexistant file?");
1306                 return TS_FAIL;
1307         }
1308     ts_uint retval;
1309     retval=fscanf(fh,"%u %u %u",&nvtx, &nedges, &ntria);
1310     vesicle->vlist=init_vertex_list(nvtx);
1311     vlist=vesicle->vlist;
1312     for(i=0;i<nvtx;i++){
8f6a69 1313    //     fscanf(fh,"%F %F %F",&vlist->vtx[i]->x,&vlist->vtx[i]->y,&vlist->vtx[i]->z);
f74313 1314        retval=fscanf(fh,"%F %F %F",&x,&y,&z);
8f6a69 1315         vlist->vtx[i]->x=x;
SP 1316         vlist->vtx[i]->y=y;
1317         vlist->vtx[i]->z=z;
f74313 1318     }
SP 1319     for(i=0;i<nedges;i++){
1320         retval=fscanf(fh,"%u %u",&vtxi1,&vtxi2);
1321         bond_add(vesicle->blist,vesicle->vlist->vtx[vtxi1-1],vesicle->vlist->vtx[vtxi2-1]);
1322     }
1323     //TODO: neighbours from bonds,
1324     //TODO: triangles from neigbours
1325
1326 //    Don't need to read triangles. Already have enough data
1327     /*
1328     for(i=0;i<ntria;i++){
1329         retval=fscanf(fh,"%u %u %u", &bi1, &bi2, &bi3);
8f6a69 1330         vtxi1=vesicle->blist->vertex1->idx;
SP 1331         vtxi2=vesicle->blist->vertex1->idx;
f74313 1332         
SP 1333     }
1334     */
41a035 1335     if(retval);
f74313 1336     fclose(fh);    
SP 1337
1338
1339
1340     return TS_SUCCESS;
1341 }