Trisurf Monte Carlo simulator
Samo Penic
2019-02-28 b5cd8cc72380e9ca576ec942753391df85a2a436
src/vertexmove.c
@@ -23,56 +23,38 @@
    ts_double delta_energy, delta_energy_cv,oenergy,dvol=0.0, darea=0.0, dstretchenergy=0.0;
    ts_double costheta,sintheta,phi,r;
   //This will hold all the information of vtx and its neighbours
   ts_vertex backupvtx[20], *constvol_vtx_moved=NULL, *constvol_vtx_backup=NULL;
   memcpy((void *)&backupvtx[0],(void *)vtx,sizeof(ts_vertex));
    ts_vertex backupvtx[20], *constvol_vtx_moved=NULL, *constvol_vtx_backup=NULL;
    memcpy((void *)&backupvtx[0],(void *)vtx,sizeof(ts_vertex));
//random move in a sphere with radius stepsize:
   r=vesicle->stepsize*rn[0];
   phi=rn[1]*2*M_PI;
   costheta=2*rn[2]-1;
   sintheta=sqrt(1-pow(costheta,2));
   vtx->x=vtx->x+r*sintheta*cos(phi);
   vtx->y=vtx->y+r*sintheta*sin(phi);
   vtx->z=vtx->z+r*costheta;
    //random move in a sphere with radius stepsize:
    r=vesicle->stepsize*rn[0];
    phi=rn[1]*2*M_PI;
    costheta=2*rn[2]-1;
    sintheta=sqrt(1-pow(costheta,2));
    vtx->x=vtx->x+r*sintheta*cos(phi);
    vtx->y=vtx->y+r*sintheta*sin(phi);
    vtx->z=vtx->z+r*costheta;
// TODO: Maybe faster if checks only nucleus-neighboring cells
// Nucleus penetration check:
//#define SQ(x) x*x
if(vesicle->R_nucleus>0.0){
   if ((vtx->x-vesicle->nucleus_center[0])*(vtx->x-vesicle->nucleus_center[0])+ (vtx->y-vesicle->nucleus_center[1])*(vtx->y-vesicle->nucleus_center[1]) + (vtx->z-vesicle->nucleus_center[2])*(vtx->z-vesicle->nucleus_center[2]) < vesicle->R_nucleus){
      vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex));
      return TS_FAIL;
   }
} else if(vesicle->R_nucleusX>0.0){
//   fprintf(stderr,"DEBUG, (Rx, Ry,Rz)^2=(%f,%f,%f)\n",vesicle->R_nucleusX, vesicle->R_nucleusY, vesicle->R_nucleusZ);
//   if (SQ(vtx->x-vesicle->nucleus_center[0])/vesicle->R_nucleusX + SQ(vtx->y-vesicle->nucleus_center[1])/vesicle->R_nucleusY + SQ(vtx->z-vesicle->nucleus_center[2])/vesicle->R_nucleusZ < 1.0){
   if ((vtx->x-vesicle->nucleus_center[0])*(vtx->x-vesicle->nucleus_center[0])/vesicle->R_nucleusX + (vtx->y-vesicle->nucleus_center[1])*(vtx->y-vesicle->nucleus_center[1])/vesicle->R_nucleusY + (vtx->z-vesicle->nucleus_center[2])*(vtx->z-vesicle->nucleus_center[2])/vesicle->R_nucleusZ < 1.0){
//   if (SQ(vtx->x)/vesicle->R_nucleusX + SQ(vtx->y)/vesicle->R_nucleusY + SQ(vtx->z)/vesicle->R_nucleusZ < 1.0){
      vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex));
      return TS_FAIL;
   }
}
   // plane confinement check whether the new position of vertex will be out of bounds
// plane confinement check whether the new position of vertex will be out of bounds
   if(vesicle->tape->plane_confinement_switch){
      if(vtx->z>vesicle->confinement_plane.z_max || vtx->z<vesicle->confinement_plane.z_min){
      vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex));
      return TS_FAIL;
      }
   }
//#undef SQ
/* Entry point for plugin vm_hard_constraint() function */
   for(i=0; i<vesicle->plist->n;i++){
      retval = vesicle->plist->plugin[i]->function->vm_hard_constraint(vesicle,vtx,&backupvtx[0]);
   ts_plugin_chain *ptr=vesicle->plist->chain->vm_hard_constraint;
   while(ptr!=NULL){
      retval = ptr->plugin->function->vm_hard_constraint(vesicle,vtx, &backupvtx[0]);
      if(retval==TS_FAIL){
         vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex));
         return TS_FAIL;
      }
      ptr=ptr->next;
   }
 
//if all the tests are successful, then energy for vtx and neighbours is calculated
   for(i=0;i<vtx->neigh_no;i++){