From 37791bf67add4094040a9b8706450695805bf88f Mon Sep 17 00:00:00 2001
From: Samo Penic <samo.penic@gmail.com>
Date: Fri, 20 May 2016 18:35:21 +0000
Subject: [PATCH] Minimal changes to trisurf core to permit the trout rbc simulations with eliptical nucleus (optional parameters in tape R_nucleusX, R_nucleusY and R_nucleusZ) were added

---
 src/io.c |   90 ++++++++++++++++++++++++++++++++++----------
 1 files changed, 69 insertions(+), 21 deletions(-)

diff --git a/src/io.c b/src/io.c
index d8c1009..2461de5 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)
@@ -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));
 
@@ -987,11 +1031,15 @@
 	CFG_SIMPLE_INT("nfil",&tape->nfil),
 	CFG_SIMPLE_INT("nfono",&tape->nfono),
 	CFG_SIMPLE_INT("R_nucleus",&tape->R_nucleus),
+	CFG_SIMPLE_FLOAT("R_nucleusX",&tape->R_nucleusX),
+	CFG_SIMPLE_FLOAT("R_nucleusY",&tape->R_nucleusY),
+	CFG_SIMPLE_FLOAT("R_nucleusZ",&tape->R_nucleusZ),
 	CFG_SIMPLE_FLOAT("dmax", &tape->dmax),
 	CFG_SIMPLE_FLOAT("dmin_interspecies", &tape->dmin_interspecies),
         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 +1062,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