Trisurf Monte Carlo simulator
Samo Penic
2016-05-18 aad5008716b9f53c40233a8d891bea82d1b3e5f3
src/io.c
@@ -1,3 +1,4 @@
/* vim: set ts=4 sts=4 sw=4 noet : */
#include "general.h"
#include<stdio.h>
#include "io.h"
@@ -15,16 +16,17 @@
#include <sys/types.h>
#include <dirent.h>
#include <errno.h>
#include <snapshot.h>
/** DUMP STATE TO DISK DRIVE **/
ts_bool dump_state(ts_vesicle *vesicle, ts_uint iteration){
    /* save current state with wrong pointers. Will fix that later */
    ts_uint i,j,k;
    FILE *fh=fopen("dump.bin","wb");
    FILE *fh=fopen(command_line_args.dump_fullfilename,"wb");
    /* dump vesicle */
    fwrite(vesicle, sizeof(ts_vesicle),1,fh);
    fwrite(vesicle, sizeof(ts_vesicle)-sizeof(ts_double),1,fh);
    /* dump vertex list */
    fwrite(vesicle->vlist, sizeof(ts_vertex_list),1,fh);
    /* dump bond list */
@@ -180,10 +182,10 @@
/** RESTORE DUMP FROM DISK **/
ts_vesicle *restore_state(ts_uint *iteration){
    ts_uint i,j,k;
    FILE *fh=fopen("dump.bin","rb");
    FILE *fh=fopen(command_line_args.dump_fullfilename,"rb");
    struct stat sb;
    if (stat("dump.bin", &sb) == -1) {
    if (stat(command_line_args.dump_fullfilename, &sb) == -1) {
        //dump file does not exist.
        return NULL;
    }
@@ -201,7 +203,7 @@
/* we restore all the data from the dump */
    /* restore vesicle */
    ts_vesicle *vesicle=(ts_vesicle *)calloc(1,sizeof(ts_vesicle));
    retval=fread(vesicle, sizeof(ts_vesicle),1,fh);
    retval=fread(vesicle, sizeof(ts_vesicle)-sizeof(ts_double),1,fh);
//   fprintf(stderr,"was here! %e\n",vesicle->dmax);
    /* restore vertex list */
@@ -418,7 +420,7 @@
                vesicle->filament_list->poly[i]->blist->bond[j]->vtx2=vesicle->filament_list->poly[i]->vlist->vtx[idx];
        }
    }
    vesicle->tape=parsetape("tape");
    vesicle->tape=parsetape(command_line_args.tape_fullfilename);
// recreating space for cells // 
    vesicle->clist=init_cell_list(vesicle->tape->ncxmax, vesicle->tape->ncymax, vesicle->tape->nczmax, vesicle->tape->stepsize);
   vesicle->clist->max_occupancy=8;
@@ -439,6 +441,7 @@
    sprintf(command_line_args.output_fullfilename,"output.pvd");
    sprintf(command_line_args.dump_fullfilename,"dump.bin");
    sprintf(command_line_args.tape_fullfilename,"tape");
    sprintf(command_line_args.tape_templatefull,"./tape");
            FILE *file;
    
while (1)
@@ -448,16 +451,19 @@
           {"force-from-tape", no_argument,       &(command_line_args.force_from_tape), 1},
      {"reset-iteration-count", no_argument, &(command_line_args.reset_iteration_count), 1},
           {"tape",     no_argument,       0, 't'},
      {"version", no_argument, 0, 'v'},
           {"output-file",  required_argument, 0, 'o'},
           {"directory",  required_argument, 0, 'd'},
           {"dump-filename", required_argument,0, 'f'},
           {"tape-options",required_argument,0,'c'},
           {"tape-template", required_argument,0,0},
            {"restore-from-vtk",required_argument,0,0},
           {0, 0, 0, 0}
         };
       /* getopt_long stores the option index here. */
       int option_index = 0;
       c = getopt_long (argc, argv, "d:f:o:t:c:",
       c = getopt_long (argc, argv, "d:f:o:t:c:v",
                        long_options, &option_index);
       /* Detect the end of the options. */
@@ -470,11 +476,23 @@
           /* If this option set a flag, do nothing else now. */
           if (long_options[option_index].flag != 0)
             break;
           printf ("option %s", long_options[option_index].name);
/*           printf ("option %s", long_options[option_index].name);
           if (optarg)
             printf (" with arg %s", optarg);
           printf ("\n");
             printf (" with arg %s", optarg);
           printf ("\n"); */
            //TODO: find a better way.
            if(strcmp(long_options[option_index].name,"tape-template")==0){
                strcpy(command_line_args.tape_templatefull,optarg);
            }
            if(strcmp(long_options[option_index].name,"restore-from-vtk")==0){
                strcpy(command_line_args.dump_from_vtk,optarg);
            }
           break;
    case 'v':
      fprintf(stdout,"TRISURF-NG v. %s, compiled on: %s %s.\n", TS_VERSION, __DATE__, __TIME__);
           fprintf(stdout,"Programming done by: Samo Penic and Miha Fosnaric\n");
           fprintf(stdout,"Released under terms of GPLv3\n");
      exit(0);
         case 'c':
              strcpy(command_line_args.tape_opts,optarg);
@@ -534,6 +552,7 @@
    if ((file = fopen(buffer, "w")) == NULL) {
                fprintf(stderr,"Could not create output file %s!\n", buffer);
                fatal("Please specify correct output file or check permissions of the file",1);
                //there is a tape template. make a copy into desired directory
                
            } else {
                fclose(file);
@@ -544,8 +563,15 @@
    strcpy(buffer,command_line_args.path);
    strcat(buffer,command_line_args.tape_fullfilename);
    if (stat(buffer, &sb) == -1) {
                ts_fprintf(stderr,"Tape '%s' does not exist!\n",buffer);
                fatal("Please select correct tape or check permissions of the file",1);
                //tape does not exist. does tape template exist?
                if(stat(command_line_args.tape_templatefull, &sb)==-1){
                    ts_fprintf(stderr,"Tape '%s' does not exist and no tape template was specified (or does not exist)!\n",buffer);
                    fatal("Please select correct tape or check permissions of the file",1);
                } else {
                    //tape template found
                    fatal("Samo did not program template copy yet",1);
                }
            } else {
                strcpy(command_line_args.tape_fullfilename,buffer);
            }
@@ -573,7 +599,6 @@
    return TS_SUCCESS;
}
@@ -745,7 +770,7 @@
        }
   fprintf(fh,"<?xml version=\"1.0\"?>\n<VTKFile type=\"Collection\" version=\"0.1\" byte_order=\"LittleEndian\" compressor=\"vtkZLibDataCompressor\">\n<Collection>");
   DIR *dir = opendir(".");
   DIR *dir = opendir(command_line_args.path);
   if(dir){
      struct dirent *ent;
        tstep=0;
@@ -774,10 +799,13 @@
   ts_bond_list *blist=vesicle->blist;
   ts_vertex **vtx=vlist->vtx;
    ts_uint i,j;
       char filename[255];
       char filename[10000];
        char just_name[255];
   FILE *fh;
        strcpy(filename,command_line_args.path);
       sprintf(just_name,"timestep_%.6u.vtu",timestepno);
        strcat(filename,just_name);
       sprintf(filename,"timestep_%.6u.vtu",timestepno);
   fh=fopen(filename, "w");
   if(fh==NULL){
      err("Cannot open file %s for writing");
@@ -804,7 +832,9 @@
      }
   }
   fprintf(fh, "<?xml version=\"1.0\"?>\n<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\" compressor=\"vtkZLibDataCompressor\">\n <UnstructuredGrid>\n");
   fprintf(fh, "<?xml version=\"1.0\"?>\n<VTKFile type=\"UnstructuredGrid\" version=\"0.1\" byte_order=\"LittleEndian\" compressor=\"vtkZLibDataCompressor\">\n");
   xml_trisurf_data(fh,vesicle);
   fprintf(fh, " <UnstructuredGrid>\n");
    fprintf(fh, "<Piece NumberOfPoints=\"%u\" NumberOfCells=\"%u\">\n",vlist->n+monono*polyno+fonono*filno, blist->n+monono*polyno+filno*(fonono-1));
    fprintf(fh,"<PointData Scalars=\"scalars\">\n<DataArray type=\"Int64\" Name=\"scalars\" format=\"ascii\">");
      for(i=0;i<vlist->n;i++){
@@ -832,13 +862,13 @@
    fprintf(fh,"</DataArray>\n</PointData>\n<CellData>\n</CellData>\n<Points>\n<DataArray type=\"Float64\" Name=\"Koordinate tock\" NumberOfComponents=\"3\" format=\"ascii\">\n");
   for(i=0;i<vlist->n;i++){
      fprintf(fh,"%e %e %e\n",vtx[i]->x,vtx[i]->y, vtx[i]->z);
      fprintf(fh,"%.17e %.17e %.17e\n",vtx[i]->x,vtx[i]->y, vtx[i]->z);
   }
   //polymeres
   if(poly){
      for(i=0;i<vesicle->poly_list->n;i++){
         for(j=0;j<vesicle->poly_list->poly[i]->vlist->n;j++){
            fprintf(fh,"%e %e %e\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 );
            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 );
         }
      }
   }
@@ -846,7 +876,7 @@
   if(fil){
      for(i=0;i<vesicle->filament_list->n;i++){
         for(j=0;j<vesicle->filament_list->poly[i]->vlist->n;j++){
            fprintf(fh,"%e %e %e\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 );
            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 );
         }
      }
   }
@@ -977,6 +1007,20 @@
ts_tape *parsetape(char *filename){
   FILE *fd = fopen (filename, "r");
   long length;
   size_t size;
   fseek (fd, 0, SEEK_END);
     length = ftell (fd);
   fseek (fd, 0, SEEK_SET);
   size=fread (tapetxt, 1, length, fd);
   fclose(fd);
   if(size);
   ts_tape *tape=parsetapebuffer(tapetxt);
   return tape;
}
ts_tape *parsetapebuffer(char *buffer){
    ts_tape *tape=(ts_tape *)calloc(1,sizeof(ts_tape));
    tape->multiprocessing=calloc(255,sizeof(char));
@@ -992,6 +1036,7 @@
        CFG_SIMPLE_FLOAT("xk0",&tape->xk0),
   CFG_SIMPLE_INT("pswitch",&tape->pswitch),
   CFG_SIMPLE_INT("constvolswitch",&tape->constvolswitch),
   CFG_SIMPLE_INT("constareaswitch",&tape->constareaswitch),
   CFG_SIMPLE_FLOAT("constvolprecision",&tape->constvolprecision),
   CFG_SIMPLE_FLOAT("pressure",&tape->pressure),
   CFG_SIMPLE_FLOAT("k_spring",&tape->kspring),
@@ -1014,7 +1059,7 @@
    cfg_t *cfg;    
    ts_uint retval;
    cfg = cfg_init(opts, 0);
    retval=cfg_parse(cfg, filename);
    retval=cfg_parse_buf(cfg, buffer);
    if(retval==CFG_FILE_ERROR){
   fatal("No tape file.",100);
   }