From 6e42ef0edaba59fd344e89ffd469202ff2bd39ac Mon Sep 17 00:00:00 2001 From: Samo Penic <samo.penic@fe.uni-lj.si> Date: Tue, 15 Mar 2016 15:40:24 +0000 Subject: [PATCH] File locking into .lock seems to work fine --- src/io.c | 73 ++++++++++++++++++++++++++++-------- 1 files changed, 56 insertions(+), 17 deletions(-) diff --git a/src/io.c b/src/io.c index d8c1009..51ef836 100644 --- a/src/io.c +++ b/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) @@ -452,6 +455,8 @@ {"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. */ @@ -470,10 +475,17 @@ /* 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 'c': @@ -534,6 +546,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 +557,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 +593,6 @@ return TS_SUCCESS; } - @@ -745,7 +764,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 +793,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 +826,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++){ @@ -977,6 +1001,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 +1030,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 +1053,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); } -- Gitblit v1.9.3