| commit | author | age | ||
| 7f6076 | 1 | /* vim: set ts=4 sts=4 sw=4 noet : */ |
| d7639a | 2 | #include<stdio.h> |
| SP | 3 | #include<math.h> |
| 2b14da | 4 | #include<stdlib.h> |
| d7639a | 5 | #include "general.h" |
| SP | 6 | #include "vertex.h" |
| a10dd5 | 7 | #include "bond.h" |
| a2a676 | 8 | #include "triangle.h" |
| bb77ca | 9 | #include "cell.h" |
| 7958e9 | 10 | #include "vesicle.h" |
| a6b1b5 | 11 | #include "io.h" |
| 7958e9 | 12 | #include "initial_distribution.h" |
| dac2e5 | 13 | #include "frame.h" |
| aec47d | 14 | #include "timestep.h" |
| 8db569 | 15 | #include "poly.h" |
| dc77e8 | 16 | #include "sh.h" |
| 459ff9 | 17 | #include "shcomplex.h" |
| ee84bd | 18 | #include "dumpstate.h" |
| 8c1bb1 | 19 | #include "restore.h" |
| 6e42ef | 20 | |
| SP | 21 | #include <fcntl.h> |
| d7639a | 22 | /** Entrance function to the program |
| SP | 23 | * @param argv is a number of parameters used in program call (including the program name |
| 24 | * @param argc is a pointer to strings (character arrays) which holds the arguments | |
| 25 | * @returns returns 0 on success, any other number on fail. | |
| 26 | */ | |
| 27 | ||
| 28 | int main(int argv, char *argc[]){ | |
| 1ab449 | 29 | ts_vesicle *vesicle; |
| SP | 30 | ts_tape *tape; |
| 8a6614 | 31 | ts_uint start_iteration=0; |
| 152052 | 32 | force_from_tape=0; |
| fab2ad | 33 | /* Area and volume for constant area and constant volume are initialized to be zero */ |
| SP | 34 | A0=0; |
| 35 | V0=0; | |
| 6e42ef | 36 | /* create lock file */ |
| SP | 37 | createPidFile("ts_trisurf",".lock",0); |
| 8a6614 | 38 | parse_args(argv,argc); // sets global variable command_line_args (defined in io.h) |
| 7f6076 | 39 | ts_fprintf(stdout,"TRISURF-NG v. %s, compiled on: %s %s.\n", TS_VERSION, __DATE__, __TIME__); |
| SP | 40 | ts_fprintf(stdout,"Programming done by: Samo Penic and Miha Fosnaric\n"); |
| 41 | ts_fprintf(stdout,"Released under terms of GPLv3\n"); | |
| 8a6614 | 42 | ts_fprintf(stdout,"Starting program...\n\n"); |
| ab798b | 43 | // vesicle = parseDump("timestep_000000.vtu"); |
| SP | 44 | // run_simulation(vesicle, vesicle->tape->mcsweeps, vesicle->tape->inititer, vesicle->tape->iterations, 1); |
| 45 | ||
| ee84bd | 46 | if(command_line_args.dump_from_vtk[0]!=0){ |
| SP | 47 | ts_fprintf(stdout,"************************************************\n"); |
| 57f830 | 48 | ts_fprintf(stdout,"**** Restoring vesicle from VTK points list ****\n"); |
| ee84bd | 49 | ts_fprintf(stdout,"************************************************\n\n"); |
| ab798b | 50 | vesicle = parseDump(command_line_args.dump_from_vtk); |
| 3cd5f4 | 51 | // write_vertex_xml_file(vesicle,9999); // here you can test if restoration and rewritting results in the same dump file. Only the date od creation of dump file must differ. |
| ab798b | 52 | tape = vesicle->tape; |
| bb2074 | 53 | int arguments_no; |
| 3d0247 | 54 | FILE *fd=fopen(".status","r"); |
| SP | 55 | if(fd!=NULL){ |
| bb2074 | 56 | arguments_no=fscanf(fd,"%u", &start_iteration); |
| SP | 57 | if(arguments_no==0){ |
| a17e91 | 58 | ts_fprintf(stdout,"No information of start iteration in .status file\n"); |
| bb2074 | 59 | } |
| 3d0247 | 60 | fclose(fd); |
| a17e91 | 61 | start_iteration++; |
| 3d0247 | 62 | } |
| bb2074 | 63 | else |
| a17e91 | 64 | ts_fprintf(stdout,"No .status file. The iteration count will start from 0\n"); |
| 57f830 | 65 | /* Here you should read new tape file, reassign some values in vertex from the tape and assign read tape to vesicle->tape */ |
| ab798b | 66 | // tape=parsetape(command_line_args.tape_fullfilename); |
| SP | 67 | // vesicle=vtk2vesicle(command_line_args.dump_from_vtk,tape); |
| ee84bd | 68 | } |
| SP | 69 | else if(command_line_args.force_from_tape){ |
| 8a6614 | 70 | ts_fprintf(stdout,"************************************************\n"); |
| SP | 71 | ts_fprintf(stdout,"**** Generating initial geometry from tape *****\n"); |
| 72 | ts_fprintf(stdout,"************************************************\n\n"); | |
| 267db5 | 73 | tape=parsetape(command_line_args.tape_fullfilename); |
| 8a6614 | 74 | vesicle=create_vesicle_from_tape(tape); |
| SP | 75 | } else { |
| 083e03 | 76 | |
| 8a6614 | 77 | ts_fprintf(stdout,"**********************************************************************\n"); |
| SP | 78 | ts_fprintf(stdout,"**** Recreating vesicle from dump file and continuing simulation *****\n"); |
| 79 | ts_fprintf(stdout,"**********************************************************************\n\n"); | |
| 267db5 | 80 | tape=parsetape(command_line_args.tape_fullfilename); |
| 8a6614 | 81 | vesicle=restore_state(&start_iteration); |
| 3f5c83 | 82 | if(vesicle==NULL){ |
| SP | 83 | ts_fprintf(stderr, "Dump file does not exist or is not a regular file! Did you mean to invoke trisurf with --force-from-tape option?\n\n"); |
| 84 | return 1; | |
| 85 | } | |
| 152052 | 86 | // nove vrednosti iz tapea... |
| d9cb01 | 87 | vesicle->bending_rigidity=tape->xk0; |
| M | 88 | vtx_set_global_values(vesicle); |
| bc9583 | 89 | vesicle->pswitch =tape->pswitch; |
| 152052 | 90 | vesicle->pressure=tape->pressure; |
| 2dcc65 | 91 | vesicle->dmax=tape->dmax*tape->dmax; |
| bcf455 | 92 | poly_assign_filament_xi(vesicle,tape); |
| 2b14da | 93 | free(vesicle->tape); |
| 9166cb | 94 | vesicle->tape=tape; |
| ea1cce | 95 | vesicle->clist->dmin_interspecies = tape->dmin_interspecies*tape->dmin_interspecies; |
| 47a7ac | 96 | |
| SP | 97 | |
| 98 | ||
| 632960 | 99 | /* spherical harmonics */ |
| SP | 100 | if(tape->shc>0){ |
| 459ff9 | 101 | vesicle->sphHarmonics=complex_sph_init(vesicle->vlist,tape->shc); |
| 632960 | 102 | } |
| SP | 103 | else { |
| 104 | vesicle->sphHarmonics=NULL; | |
| 105 | } | |
| d9cb01 | 106 | |
| 144784 | 107 | if(command_line_args.reset_iteration_count) start_iteration=tape->inititer; |
| 8a6614 | 108 | else start_iteration++; |
| 083e03 | 109 | |
| 8a6614 | 110 | if(start_iteration>=tape->iterations){ |
| SP | 111 | ts_fprintf(stdout, "Simulation already completed. if you want to rerun it try with --force-from-tape or --reset-iteration-count\n\n"); |
| 112 | return 0; | |
| 113 | } | |
| a752b5 | 114 | |
| SP | 115 | /* if requested in tape, we can have smaller number of polymeres attached to membrane than the number of polymeres in dump file */ |
| 116 | if(vesicle->tape->npoly != vesicle->poly_list->n){ | |
| 117 | ||
| 118 | ts_fprintf(stdout,"(INFO) the number of polymeres attached to membrane in tape is different than a number of polymeres in dump file!\n"); | |
| 119 | if(vesicle->tape->npoly > vesicle->poly_list->n){ | |
| 120 | ts_fprintf(stdout,"(INFO) It is possible to decrease the number of polymeres on the membrane, but it is not allowed to increase its number. The maximal allowed number in tape is %d The execution of program will terminate!\n",vesicle->poly_list->n); | |
| 121 | fatal("Terminating due to increase of number of polymeres",1); | |
| 122 | } else { | |
| 123 | remove_random_polymeres(vesicle->poly_list, vesicle->poly_list->n - vesicle->tape->npoly); | |
| 124 | ts_fprintf(stdout,"(INFO)\n(INFO) The new number of polymeres from tape is %d.\n\n",vesicle->poly_list->n); | |
| 125 | ||
| 126 | } | |
| 127 | } | |
| 8a6614 | 128 | } |
| bac004 | 129 | //printf("nucleus coords: %.17e %.17e %.17e\n",vesicle->nucleus_center[0], vesicle->nucleus_center[1], vesicle->nucleus_center[2]); |
| 90882f | 130 | // write_vertex_xml_file(vesicle,0); |
| SP | 131 | // exit(1); |
| 8a6614 | 132 | |
| 38ed80 | 133 | //write_vertex_xml_file(vesicle,1000); |
| 8a6614 | 134 | run_simulation(vesicle, tape->mcsweeps, tape->inititer, tape->iterations, start_iteration); |
| 267db5 | 135 | write_master_xml_file(command_line_args.output_fullfilename); |
| 8a6614 | 136 | vesicle_free(vesicle); |
| SP | 137 | tape_free(tape); |
| 138 | return 0; //program finished perfectly ok. We return 0. | |
| d7639a | 139 | } |