#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_init(&(vesicle->mutex->vtx_taint),NULL); pthread_mutex_init(&(vesicle->mutex->vtx_untaint),NULL); pthread_mutex_init(&(vesicle->mutex->cell_modify),NULL); for(i=0;ithreads;i++){ data[i].thread_no=i; data[i].vesicle=vesicle; data[i].threads=vesicle->threads; } 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(&(vesicle->mutex->vtx_taint)); pthread_mutex_destroy(&(vesicle->mutex->vtx_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_vertex *vtx; //ts_bool retval; // 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;imutex->vtx_taint); //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(&vesicle->mutex->vtx_untaint); vertex_taint(vesicle->vlist->vtx[i],1); pthread_mutex_unlock(&vesicle->mutex->vtx_untaint); pthread_mutex_unlock(&vesicle->mutex->vtx_taint); /**** THREAD IS RELEASING MUTEX RESOURCES ******/ single_verticle_timestep(vesicle,vesicle->vlist->vtx[i],rnvec); pthread_mutex_lock(&vesicle->mutex->vtx_untaint); vertex_untaint(vesicle->vlist->vtx[i],1); pthread_mutex_unlock(&vesicle->mutex->vtx_untaint); } // ts_int cnt=0; for(i=0;i<(ts_uint)((ts_double)(vesicle->vlist->n)/(ts_double)vesicle->threads);i++){ b=rand() % vesicle->blist->n; //find a bond and return a pointer to a bond... //call single_bondflip_timestep... vtx=vesicle->blist->bond[b]->vtx1; /**** THREAD IS POTENTIALLY LOCKED ******/ pthread_mutex_lock(&vesicle->mutex->vtx_taint); while(vertex_tainted(vtx,2,1)){ ts_fprintf(stdout, "BF:: thID=%d Vertex %d is tainted. 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(&vesicle->mutex->vtx_untaint); vertex_taint(vtx,2); pthread_mutex_unlock(&vesicle->mutex->vtx_untaint); pthread_mutex_unlock(&vesicle->mutex->vtx_taint); /**** THREAD IS RELEASING MUTEX RESOURCES ******/ //retval= single_bondflip_timestep(vesicle,vesicle->blist->bond[b],rnvec); pthread_mutex_lock(&vesicle->mutex->vtx_untaint); vertex_untaint(vtx,2); pthread_mutex_unlock(&vesicle->mutex->vtx_untaint); // 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 */ }