#include #include #include #include //#include //usleep requires it //#include "io.h" #include "general.h" #include "timestep.h" #include "vertexmove.h" #include "bondflip.h" #include "frame.h" #include "vertex.h" #include "io.h" ts_bool run_simulation(ts_vesicle *vesicle, ts_uint mcsweeps, ts_uint inititer, ts_uint iterations){ ts_uint i, j,k ; centermass(vesicle); cell_occupation(vesicle); ts_fprintf(stdout, "Starting simulation (first %d x %d MC sweeps will not be recorded on disk)\n", inititer, mcsweeps); ts_fprintf(stdout, "Starting %d threads\n",vesicle->threads); pthread_t *tid=(pthread_t *)malloc(sizeof(pthread_t)*vesicle->threads); thdata *data=(thdata *)malloc(sizeof(thdata)*vesicle->threads); pthread_mutex_t mutex_taint, mutex_untaint; pthread_mutex_init(&mutex_taint,NULL); pthread_mutex_init(&mutex_untaint,NULL); for(i=0;ithreads;i++){ data[i].thread_no=i; data[i].vesicle=vesicle; data[i].threads=vesicle->threads; data[i].vtx_tainting_lock=&mutex_taint; data[i].vtx_untainting_lock=&mutex_untaint; } for(i=0;ithreads;k++){ pthread_create(&tid[k], NULL, single_timestep, (void *)&data[k]); } for(k=0;kthreads;k++){ pthread_join(tid[k],NULL); } // single_timestep(vesicle); } centermass(vesicle); cell_occupation(vesicle); if(i>inititer){ write_vertex_xml_file(vesicle,i-inititer); } } pthread_mutex_destroy(&mutex_taint); pthread_mutex_destroy(&mutex_untaint); pthread_exit(NULL); return TS_SUCCESS; } void * single_timestep(void *thread_data){ thdata *data; data=(thdata *)thread_data; ts_vesicle *vesicle=data->vesicle; ts_uint thID=data->thread_no; ts_uint partition_size=(ts_uint)(vesicle->vlist->n/data->threads); ts_uint end; if(thID==data->threads-1){ end=vesicle->vlist->n; } else { end=(thID+1)*partition_size; } ts_double rnvec[3]; ts_uint i,j; //b; // ts_fprintf(stdout,"Thread thID=%d report for duty. My vtxes are in range from %d to %d.\n",thID,thID*partition_size, end-1); for(i=thID*partition_size;ivtx_tainting_lock); //taint if no other process is tainting or wait until you can taint // ts_fprintf(stdout, "thID=%d:: Tainting vertex %d, level=%d. Waiting....\n",thID, i, vesicle->vlist->vtx[i]->locked); while(vertex_tainted(vesicle->vlist->vtx[i],1,1)){ ts_fprintf(stdout, "thID=%d:: Vertex %d is tainted, so I cannot try vertexmove. Amount=%d. BU(H)TELJ!\n neigh. vtxs: ",thID, i, vesicle->vlist->vtx[i]->locked); for(j=0; jvlist->vtx[i]->neigh_no; j++){ ts_fprintf(stdout, "%d(a=%d) ", vesicle->vlist->vtx[i]->neigh[j]->idx, vesicle->vlist->vtx[i]->neigh[j]->locked); } ts_fprintf(stdout, ".\n"); } pthread_mutex_lock(data->vtx_untainting_lock); vertex_taint(vesicle->vlist->vtx[i],1); pthread_mutex_unlock(data->vtx_untainting_lock); pthread_mutex_unlock(data->vtx_tainting_lock); /**** THREAD IS RELEASING MUTEX RESOURCES ******/ single_verticle_timestep(vesicle,vesicle->vlist->vtx[i],rnvec); pthread_mutex_lock(data->vtx_untainting_lock); vertex_untaint(vesicle->vlist->vtx[i],1); pthread_mutex_unlock(data->vtx_untainting_lock); // ts_fprintf(stdout, "Vertex %d should be untainted, level=%d.\n", i, vesicle->vlist->vtx[i]->locked); } // ts_int cnt=0; /* for(i=0;ivlist->n;i++){ b=rand() % vesicle->blist->n; //find a bond and return a pointer to a bond... //call single_bondflip_timestep... retval=single_bondflip_timestep(vesicle,vesicle->blist->bond[b],rnvec); // if(retval==TS_SUCCESS) cnt++; } // printf("Bondflip success rate in one sweep: %d/%d=%e\n", cnt,vesicle->blist->n,(double)cnt/(double)vesicle->blist->n); */ /* if(retval); return TS_SUCCESS; */ pthread_exit(0); /* exit */ }