Trisurf Monte Carlo simulator
Samo Penic
2021-05-10 6487a03362d35589c286d0660eba123a7ab00535
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");
6487a0 938     fprintf(fh,"<DataArray type=\"Float64\" Name=\"direct_interaction_force\" format=\"ascii\">");
SP 939     for(i=0;i<vlist->n;i++){
940         fprintf(fh,"%.17e ",vtx[i]->direct_interaction_force);
941     }
942         //polymeres
943         if(poly){
944             poly_idx=vlist->n;
945             for(i=0;i<vesicle->poly_list->n;i++){
946                 for(j=0;j<vesicle->poly_list->poly[i]->vlist->n;j++,poly_idx++){
947                     fprintf(fh,"%.17e ", vesicle->poly_list->poly[i]->vlist->vtx[j]->direct_interaction_force);
948                 }
949             }
950         }
951         //filaments
952         if(fil){
953             poly_idx=vlist->n+monono*polyno;
954             for(i=0;i<vesicle->filament_list->n;i++){
955                 for(j=0;j<vesicle->filament_list->poly[i]->vlist->n;j++,poly_idx++){
956         //    fprintf(stderr,"was here\n");
957                     fprintf(fh,"%.17e ",  vesicle->filament_list->poly[i]->vlist->vtx[j]->direct_interaction_force);
958                 }
959             }
960         }
961     fprintf(fh,"</DataArray>\n");
45c708 962
5c64e2 963     //here comes additional data. Energy!
SP 964     fprintf(fh,"<DataArray type=\"Float64\" Name=\"bending_energy\" format=\"ascii\">");
965     for(i=0;i<vlist->n;i++){
966         fprintf(fh,"%.17e ",vtx[i]->energy*vtx[i]->xk);
967     }
968         //polymeres
969         if(poly){
970             poly_idx=vlist->n;
971             for(i=0;i<vesicle->poly_list->n;i++){
972                 for(j=0;j<vesicle->poly_list->poly[i]->vlist->n;j++,poly_idx++){
973                     fprintf(fh,"%.17e ", vesicle->poly_list->poly[i]->vlist->vtx[j]->energy* vesicle->poly_list->poly[i]->k);
974                 }
975             }
976         }
977         //filaments
978         if(fil){
979             poly_idx=vlist->n+monono*polyno;
980             for(i=0;i<vesicle->filament_list->n;i++){
981                 for(j=0;j<vesicle->filament_list->poly[i]->vlist->n;j++,poly_idx++){
982         //    fprintf(stderr,"was here\n");
983                     fprintf(fh,"%.17e ",  vesicle->filament_list->poly[i]->vlist->vtx[j]->energy*  vesicle->filament_list->poly[i]->k);
984                 }
985             }
986         }
987     fprintf(fh,"</DataArray>\n");
988
45c708 989     
13d445 990     fprintf(fh,"</PointData>\n<CellData>\n");
SP 991
7ec6fb 992     if(vesicle->tape->stretchswitch==1){
SP 993         fprintf(fh,"<DataArray type=\"Float64\" Name=\"stretching_energy\" format=\"ascii\">");
cf7aba 994         for(i=0;i<blist->n;i++){
SP 995             fprintf(fh, "0.0 ");
996         }
997         for(i=0;i<monono*polyno+filno*(fonono-1);i++){
13d445 998             fprintf(fh,"0.0 ");
7ec6fb 999         }
13d445 1000         for(i=0;i<vesicle->tlist->n;i++){
SP 1001             fprintf(fh,"%.17e ",vesicle->tlist->tria[i]->energy);
1002         }
7ec6fb 1003         fprintf(fh,"</DataArray>\n");
SP 1004     }
45c708 1005
13d445 1006
SP 1007
1008     fprintf(fh,"</CellData>\n<Points>\n<DataArray type=\"Float64\" Name=\"Koordinate tock\" NumberOfComponents=\"3\" format=\"ascii\">\n");
d7639a 1009     for(i=0;i<vlist->n;i++){
aad500 1010         fprintf(fh,"%.17e %.17e %.17e\n",vtx[i]->x,vtx[i]->y, vtx[i]->z);
40aa5b 1011     }
SP 1012     //polymeres
1013     if(poly){
1014         for(i=0;i<vesicle->poly_list->n;i++){
1015             for(j=0;j<vesicle->poly_list->poly[i]->vlist->n;j++){
aad500 1016                 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 1017             }
M 1018         }
1019     }
1020     //filaments
1021     if(fil){
1022         for(i=0;i<vesicle->filament_list->n;i++){
1023             for(j=0;j<vesicle->filament_list->poly[i]->vlist->n;j++){
aad500 1024                 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 1025             }
SP 1026         }
d7639a 1027     }
SP 1028
1029     fprintf(fh,"</DataArray>\n</Points>\n<Cells>\n<DataArray type=\"Int64\" Name=\"connectivity\" format=\"ascii\">");
1030     for(i=0;i<blist->n;i++){
e016c4 1031             fprintf(fh,"%u %u\n",blist->bond[i]->vtx1->idx,blist->bond[i]->vtx2->idx);
d7639a 1032     }
40aa5b 1033     //polymeres
SP 1034     if(poly){
3c1ac1 1035         poly_idx=vlist->n;
40aa5b 1036         for(i=0;i<vesicle->poly_list->n;i++){
SP 1037             for(j=0;j<vesicle->poly_list->poly[i]->blist->n;j++){
3c1ac1 1038 //                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 1039                 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 1040             }
SP 1041     //grafted bonds
3c1ac1 1042         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 1043         }
SP 1044
1045     }
1046     
58230a 1047     //filaments
M 1048     if(fil){
1049         poly_idx=vlist->n+monono*polyno;
1050         for(i=0;i<vesicle->filament_list->n;i++){
1051             for(j=0;j<vesicle->filament_list->poly[i]->blist->n;j++){
1052                 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);
1053 //        fprintf(stderr,"was here\n");
1054             
1055             }
1056         }
1057
1058     }
8db203 1059     for(i=0;i<vesicle->tlist->n;i++){
SP 1060         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);
1061     }
d7639a 1062     fprintf(fh,"</DataArray>\n<DataArray type=\"Int64\" Name=\"offsets\" format=\"ascii\">");
58230a 1063     for (i=2;i<(blist->n+monono*polyno+(fonono-1)*filno)*2+1;i+=2){
d7639a 1064     fprintf(fh,"%u ",i);
SP 1065     }
8db203 1066     for(j=i+1;j<i+3*(vesicle->tlist->n);j+=3){ //let's continue counting from where we left of
SP 1067         fprintf(fh,"%u ", j);
1068     }
d7639a 1069     fprintf(fh,"\n");
SP 1070     fprintf(fh,"</DataArray>\n<DataArray type=\"UInt8\" Name=\"types\" format=\"ascii\">\n");
8db203 1071      for (i=0;i<blist->n+monono*polyno+(fonono-1)*filno;i++){
d7639a 1072         fprintf(fh,"3 ");
SP 1073     }
8db203 1074     for(i=0;i<vesicle->tlist->n;i++){
SP 1075         fprintf(fh,"5 ");
1076     }
d7639a 1077     fprintf(fh,"</DataArray>\n</Cells>\n</Piece>\n</UnstructuredGrid>\n</VTKFile>\n");
SP 1078     fclose(fh);
1079     return TS_SUCCESS;
1080
1081 }
1082
1083 ts_bool write_vertex_vtk_file(ts_vesicle *vesicle,ts_char *filename, ts_char *text){
a6b1b5 1084     ts_vertex_list *vlist=vesicle->vlist;
SP 1085     ts_bond_list *blist=vesicle->blist;
1086     ts_vertex **vtx=vlist->vtx;
1087     ts_uint i;
d7639a 1088     FILE *fh;
SP 1089     
1090     fh=fopen(filename, "w");
1091     if(fh==NULL){
1092         err("Cannot open file %s for writing");
1093         return TS_FAIL;
1094     }
1095     /* Here comes header of the file */
1096 //    fprintf(stderr,"NSHELL=%u\n",nshell);
1097     fprintf(fh, "# vtk DataFile Version 2.0\n");
1098     /* TODO: Do a sanity check on text. Max 255 char, must not me \n terminated */ 
1099     fprintf(fh, "%s\n", text);
1100     fprintf(fh,"ASCII\n");
1101     fprintf(fh,"DATASET UNSTRUCTURED_GRID\n");
1102     fprintf(fh,"POINTS %u double\n", vlist->n);
1103     for(i=0;i<vlist->n;i++){
8f6a69 1104         fprintf(fh,"%e %e %e\n",vtx[i]->x,vtx[i]->y, vtx[i]->z);
d7639a 1105     }
SP 1106     
1107     fprintf(fh,"CELLS %u %u\n",blist->n,3*blist->n);
1108     for(i=0;i<blist->n;i++){
e016c4 1109             fprintf(fh,"2 %u %u\n",blist->bond[i]->vtx1->idx,blist->bond[i]->vtx2->idx);
d7639a 1110     }
SP 1111     fprintf(fh,"CELL_TYPES %u\n",blist->n);
1112     for(i=0;i<blist->n;i++)
1113         fprintf(fh,"3\n");
1114
1115     fprintf(fh,"POINT_DATA %u\n", vlist->n);
1116     fprintf(fh,"SCALARS scalars long 1\n");
1117     fprintf(fh,"LOOKUP_TABLE default\n");
1118
1119     for(i=0;i<vlist->n;i++)
8f6a69 1120         fprintf(fh,"%u\n",vtx[i]->idx);
d7639a 1121
SP 1122     fclose(fh);
1123     return TS_SUCCESS;
1124 }
1125
1126
1127
144784 1128 ts_bool write_pov_file(ts_vesicle *vesicle, char *filename){
SP 1129     FILE *fh;
1130     ts_uint i;
1131     
1132     fh=fopen(filename, "w");
1133     if(fh==NULL){
1134         err("Cannot open file %s for writing");
1135         return TS_FAIL;
1136     }
1137
1138     for(i=0;i<vesicle->tlist->n;i++){
1139     
1140     fprintf(fh,"\ttriangle {");
1141     fprintf(fh,"\t<%e,%e,%e> <%e,%e,%e> <%e,%e,%e> }\n", 
1142     vesicle->tlist->tria[i]->vertex[0]->x,
1143     vesicle->tlist->tria[i]->vertex[0]->y,
1144     vesicle->tlist->tria[i]->vertex[0]->z,
1145
1146     vesicle->tlist->tria[i]->vertex[1]->x,
1147     vesicle->tlist->tria[i]->vertex[1]->y,
1148     vesicle->tlist->tria[i]->vertex[1]->z,
1149
1150     vesicle->tlist->tria[i]->vertex[2]->x,
1151     vesicle->tlist->tria[i]->vertex[2]->y,
1152     vesicle->tlist->tria[i]->vertex[2]->z
1153     );
1154     }
1155         
1156     fclose(fh);
1157     return TS_SUCCESS;
1158 }
1159
1160
1ab449 1161 ts_tape *parsetape(char *filename){
698ae1 1162     FILE *fd = fopen (filename, "r");
SP 1163     long length;
1164     size_t size;
1165     fseek (fd, 0, SEEK_END);
1166       length = ftell (fd);
1167     fseek (fd, 0, SEEK_SET);
1168     size=fread (tapetxt, 1, length, fd);
1169     fclose(fd);
1170     if(size);
1171     ts_tape *tape=parsetapebuffer(tapetxt);
1172     return tape;
1173 }
1174
1175 ts_tape *parsetapebuffer(char *buffer){
1ab449 1176     ts_tape *tape=(ts_tape *)calloc(1,sizeof(ts_tape));
SP 1177     tape->multiprocessing=calloc(255,sizeof(char));
40aa5b 1178
d7639a 1179     cfg_opt_t opts[] = {
1ab449 1180         CFG_SIMPLE_INT("nshell", &tape->nshell),
SP 1181         CFG_SIMPLE_INT("npoly", &tape->npoly),
1182         CFG_SIMPLE_INT("nmono", &tape->nmono),
58230a 1183     CFG_SIMPLE_INT("nfil",&tape->nfil),
M 1184     CFG_SIMPLE_INT("nfono",&tape->nfono),
e98482 1185     CFG_SIMPLE_INT("internal_poly",&tape->internal_poly),
58230a 1186     CFG_SIMPLE_INT("R_nucleus",&tape->R_nucleus),
37791b 1187     CFG_SIMPLE_FLOAT("R_nucleusX",&tape->R_nucleusX),
SP 1188     CFG_SIMPLE_FLOAT("R_nucleusY",&tape->R_nucleusY),
1189     CFG_SIMPLE_FLOAT("R_nucleusZ",&tape->R_nucleusZ),
58230a 1190     CFG_SIMPLE_FLOAT("dmax", &tape->dmax),
ea1cce 1191     CFG_SIMPLE_FLOAT("dmin_interspecies", &tape->dmin_interspecies),
1ab449 1192         CFG_SIMPLE_FLOAT("xk0",&tape->xk0),
SP 1193     CFG_SIMPLE_INT("pswitch",&tape->pswitch),
9166cb 1194     CFG_SIMPLE_INT("constvolswitch",&tape->constvolswitch),
c0ae90 1195     CFG_SIMPLE_INT("constareaswitch",&tape->constareaswitch),
43c042 1196     CFG_SIMPLE_FLOAT("constvolprecision",&tape->constvolprecision),
2ae815 1197     CFG_SIMPLE_INT("stretchswitch",&tape->stretchswitch),
SP 1198     CFG_SIMPLE_FLOAT("xkA0",&tape->xkA0),    
1ab449 1199     CFG_SIMPLE_FLOAT("pressure",&tape->pressure),
SP 1200     CFG_SIMPLE_FLOAT("k_spring",&tape->kspring),
b30f45 1201     CFG_SIMPLE_FLOAT("xi",&tape->xi),
1ab449 1202         CFG_SIMPLE_FLOAT("stepsize",&tape->stepsize),
SP 1203         CFG_SIMPLE_INT("nxmax", &tape->ncxmax),
1204         CFG_SIMPLE_INT("nymax", &tape->ncymax),
1205         CFG_SIMPLE_INT("nzmax", &tape->nczmax),
1206         CFG_SIMPLE_INT("iterations",&tape->iterations),
1207     CFG_SIMPLE_INT("mcsweeps",&tape->mcsweeps),
1208     CFG_SIMPLE_INT("inititer", &tape->inititer),
819a09 1209                 CFG_SIMPLE_BOOL("quiet",(cfg_bool_t *)&tape->quiet),
S 1210         CFG_SIMPLE_STR("multiprocessing",&tape->multiprocessing),
1ab449 1211         CFG_SIMPLE_INT("smp_cores",&tape->brezveze0),
SP 1212         CFG_SIMPLE_INT("cluster_nodes",&tape->brezveze1),
1213         CFG_SIMPLE_INT("distributed_processes",&tape->brezveze2),
dc77e8 1214     CFG_SIMPLE_INT("spherical_harmonics_coefficients",&tape->shc),
e5858f 1215     CFG_SIMPLE_INT("number_of_vertices_with_c0", &tape->number_of_vertices_with_c0),
SP 1216     CFG_SIMPLE_FLOAT("c0",&tape->c0),
1217     CFG_SIMPLE_FLOAT("w",&tape->w),
250de4 1218     CFG_SIMPLE_FLOAT("F",&tape->F),
6c274d 1219 /* Variables related to plane confinement */
514ebc 1220     CFG_INT("plane_confinement_switch", 0, CFGF_NONE),
SP 1221     CFG_FLOAT("plane_d", 15, CFGF_NONE),
1222     CFG_FLOAT("plane_F", 1000, CFGF_NONE),
6c274d 1223 /* Variables related to stretching */
36bc6d 1224 //    CFG_FLOAT("stretchswitch", 0, CFGF_NONE),
SP 1225 //    CFG_FLOAT("xkA0",0,CFGF_NONE),
d7639a 1226         CFG_END()
SP 1227     };
1228     cfg_t *cfg;    
1229     ts_uint retval;
1230     cfg = cfg_init(opts, 0);
698ae1 1231     retval=cfg_parse_buf(cfg, buffer);
514ebc 1232     tape->plane_confinement_switch=cfg_getint(cfg,"plane_confinement_switch");
88bdd7 1233     tape->plane_d=cfg_getfloat(cfg,"plane_d");
SP 1234     tape->plane_F=cfg_getfloat(cfg,"plane_F");
514ebc 1235
d7639a 1236     if(retval==CFG_FILE_ERROR){
a6b1b5 1237     fatal("No tape file.",100);
d7639a 1238     }
SP 1239     else if(retval==CFG_PARSE_ERROR){
1240     fatal("Invalid tape!",100);
1241     }
a2db52 1242
7b0c07 1243     /* here we override all values read from tape with values from commandline*/
SP 1244     getcmdline_tape(cfg,command_line_args.tape_opts);
d7639a 1245     cfg_free(cfg);
40aa5b 1246
SP 1247
1ab449 1248     /* global variables are set automatically */
SP 1249     quiet=tape->quiet;
1250     return tape;
1251 }
d7639a 1252
1ab449 1253 ts_bool tape_free(ts_tape *tape){
SP 1254     free(tape->multiprocessing);
1255     free(tape);
1256     return TS_SUCCESS;
d7639a 1257 }
f74313 1258
SP 1259
7b0c07 1260
SP 1261 ts_bool getcmdline_tape(cfg_t *cfg, char *opts){
1262
1263     char *commands, *backup, *saveptr, *saveopptr, *command, *operator[2];
07e3de 1264     operator[0]=0;
SP 1265     operator[1]=0;
7b0c07 1266     ts_uint i,j;
SP 1267     commands=(char *)malloc(10000*sizeof(char));
1268     backup=commands; //since the pointer to commands will be lost, we acquire a pointer that will serve as backup.
1269     strcpy(commands,opts);
1270     for(i=0; ;i++, commands=NULL){
1271         //breaks comma separated list of commands into specific commands.
1272         command=strtok_r(commands,",",&saveptr);    
1273         if(command==NULL) break;
1274 //        fprintf(stdout,"Command %d: %s\n",i,command);    
1275         //extracts name of command and value of command into operator[2] array.
1276         for(j=0; j<2;j++,command=NULL){
1277             operator[j]=strtok_r(command,"=",&saveopptr);
1278             if(operator[j]==NULL) break;
1279 //            fprintf(stdout," ---> Operator %d: %s\n",j,operator[j]);        
1280         }
1281         //1. check: must have 2 operators.
1282         if(j!=2) fatal("Error. Command line tape options are not formatted properly",1);
1283
1284     //    cfg_setstr(cfg,operator[0],operator[1]);
1285         cmdline_to_tape(cfg,operator[0],operator[1]);
1286         //2. check: must be named properly.
1287         //3. check: must be of right format (integer, double, string, ...)
1288         
1289     }
1290     free(backup);
1291     return TS_SUCCESS;
1292 }
1293
1294
1295 ts_bool cmdline_to_tape(cfg_t *cfg, char *key, char *val){
1296
1297     cfg_opt_t *cfg_opt=cfg_getopt(cfg,key);
1298     if(cfg_opt==NULL) fatal("Commandline tape option not recognised",1); //return TS_FAIL; 
1299     switch (cfg_opt->type){
1300         case CFGT_INT:
1301             cfg_setint(cfg,key,atol(val));
1302             break;
1303         case CFGT_FLOAT:
1304             cfg_setfloat(cfg,key,atof(val));
1305             break;
1306 /*        case CFGT_BOOL:
1307             cfg_setbool(cfg,operator[0],operator[1]);
1308             break; */
1309         case CFGT_STR:
1310             cfg_setstr(cfg,key,val);
1311             break;
1312         default:
1313             break;
1314
1315     }
1316     return TS_SUCCESS;
1317 }
1318
1319
1320
f74313 1321 ts_bool read_geometry_file(char *fname, ts_vesicle *vesicle){
SP 1322     FILE *fh;
1323     ts_uint i, nvtx,nedges,ntria;
1324     ts_uint vtxi1,vtxi2;
1325     float x,y,z;
1326     ts_vertex_list *vlist;
1327     fh=fopen(fname, "r");
1328         if(fh==NULL){
1329                 err("Cannot open file for reading... Nonexistant file?");
1330                 return TS_FAIL;
1331         }
1332     ts_uint retval;
1333     retval=fscanf(fh,"%u %u %u",&nvtx, &nedges, &ntria);
1334     vesicle->vlist=init_vertex_list(nvtx);
1335     vlist=vesicle->vlist;
1336     for(i=0;i<nvtx;i++){
8f6a69 1337    //     fscanf(fh,"%F %F %F",&vlist->vtx[i]->x,&vlist->vtx[i]->y,&vlist->vtx[i]->z);
f74313 1338        retval=fscanf(fh,"%F %F %F",&x,&y,&z);
8f6a69 1339         vlist->vtx[i]->x=x;
SP 1340         vlist->vtx[i]->y=y;
1341         vlist->vtx[i]->z=z;
f74313 1342     }
SP 1343     for(i=0;i<nedges;i++){
1344         retval=fscanf(fh,"%u %u",&vtxi1,&vtxi2);
1345         bond_add(vesicle->blist,vesicle->vlist->vtx[vtxi1-1],vesicle->vlist->vtx[vtxi2-1]);
1346     }
1347     //TODO: neighbours from bonds,
1348     //TODO: triangles from neigbours
1349
1350 //    Don't need to read triangles. Already have enough data
1351     /*
1352     for(i=0;i<ntria;i++){
1353         retval=fscanf(fh,"%u %u %u", &bi1, &bi2, &bi3);
8f6a69 1354         vtxi1=vesicle->blist->vertex1->idx;
SP 1355         vtxi2=vesicle->blist->vertex1->idx;
f74313 1356         
SP 1357     }
1358     */
41a035 1359     if(retval);
f74313 1360     fclose(fh);    
SP 1361
1362
1363
1364     return TS_SUCCESS;
1365 }