Trisurf Monte Carlo simulator
Samo Penic
2014-04-30 dd5acac9147ee4e7a5b90f26953c19497626b945
src/vertexmove.c
@@ -20,7 +20,7 @@
    ts_double dist;
    ts_bool retval; 
    ts_uint cellidx; 
    ts_double delta_energy,oenergy,dvol=0.0;
    ts_double delta_energy, delta_energy_cv,oenergy,dvol=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;
@@ -92,22 +92,14 @@
   memcpy((void *)&backupvtx[i+1],(void *)vtx->neigh[i],sizeof(ts_vertex));
   }
   if(vesicle->pswitch == 1){
   if(vesicle->pswitch == 1 || vesicle->tape->constvolswitch==1){
      for(i=0;i<vtx->tristar_no;i++) dvol-=vtx->tristar[i]->volume;
   };
    delta_energy=0;
    if(vesicle->tape->constvolswitch == 1){
        retval=constvolume(vesicle, vtx, dvol, &delta_energy, constvol_vtx_moved,constvol_vtx_backup);
        if(retval==TS_FAIL){ // if we couldn't move the vertex to assure constant volume
            vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex));
           for(i=0;i<vtx->neigh_no;i++){
              vtx->neigh[i]=memcpy((void *)vtx->neigh[i],(void *)&backupvtx[i+1],sizeof(ts_vertex));
           }
            return TS_FAIL;
        }
    }
//    vesicle_volume(vesicle);
//    fprintf(stderr,"Volume in the beginning=%1.16e\n", vesicle->volume);
    //update the normals of triangles that share bead i.
    for(i=0;i<vtx->tristar_no;i++) triangle_normal_vector(vtx->tristar[i]);
@@ -121,12 +113,32 @@
        delta_energy+=vtx->neigh[i]->xk*(vtx->neigh[i]->energy-oenergy);
    }
   if(vesicle->pswitch == 1){
   if(vesicle->pswitch == 1 || vesicle->tape->constvolswitch == 1){
      for(i=0;i<vtx->tristar_no;i++) dvol+=vtx->tristar[i]->volume;
        delta_energy-=vesicle->pressure*dvol;
        if(vesicle->pswitch==1) delta_energy-=vesicle->pressure*dvol;
   };
//    vesicle_volume(vesicle);
//    fprintf(stderr,"Volume before=%1.16e\n", vesicle->volume);
   if(vesicle->tape->constvolswitch == 1){
        retval=constvolume(vesicle, vtx, -dvol, &delta_energy_cv, &constvol_vtx_moved,&constvol_vtx_backup);
        if(retval==TS_FAIL){ // if we couldn't move the vertex to assure constant volume
            vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex));
           for(i=0;i<vtx->neigh_no;i++){
              vtx->neigh[i]=memcpy((void *)vtx->neigh[i],(void *)&backupvtx[i+1],sizeof(ts_vertex));
           }
            for(i=0;i<vtx->tristar_no;i++) triangle_normal_vector(vtx->tristar[i]);
 //           fprintf(stderr,"fajlam!\n");
            return TS_FAIL;
        }
//    vesicle_volume(vesicle);
//    fprintf(stderr,"Volume after=%1.16e\n", vesicle->volume);
//    fprintf(stderr,"Volume after-dvol=%1.16e\n", vesicle->volume-dvol);
//    fprintf(stderr,"Denergy before=%e\n",delta_energy);
    delta_energy+=delta_energy_cv;
//    fprintf(stderr,"Denergy after=%e\n",delta_energy);
    }
/* No poly-bond energy for now!
   if(vtx->grafted_poly!=NULL){
      delta_energy+=
@@ -148,6 +160,7 @@
#endif
    {
    //not accepted, reverting changes
  //  fprintf(stderr,"MC failed\n");
   vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex));
   for(i=0;i<vtx->neigh_no;i++){
      vtx->neigh[i]=memcpy((void *)vtx->neigh[i],(void *)&backupvtx[i+1],sizeof(ts_vertex));
@@ -156,14 +169,18 @@
    //update the normals of triangles that share bead i.
   for(i=0;i<vtx->tristar_no;i++) triangle_normal_vector(vtx->tristar[i]);
//    fprintf(stderr, "before vtx(x,y,z)=%e,%e,%e\n",constvol_vtx_moved->x, constvol_vtx_moved->y, constvol_vtx_moved->z);
    if(vesicle->tape->constvolswitch == 1){
        constvolumerestore(constvol_vtx_moved,constvol_vtx_backup);
    }
//    fprintf(stderr, "after vtx(x,y,z)=%e,%e,%e\n",constvol_vtx_moved->x, constvol_vtx_moved->y, constvol_vtx_moved->z);
//    vesicle_volume(vesicle);
//    fprintf(stderr,"Volume after fail=%1.16e\n", vesicle->volume);
    return TS_FAIL; 
    }
}
   //accepted   
 //   fprintf(stderr,"MC accepted\n");
//   oldcellidx=vertex_self_avoidance(vesicle, &backupvtx[0]);
   if(vtx->cell!=vesicle->clist->cell[cellidx]){
      retval=cell_add_vertex(vesicle->clist->cell[cellidx],vtx);
@@ -173,10 +190,12 @@
   }
    if(vesicle->tape->constvolswitch == 1){
        constvolumeaccept(constvol_vtx_moved,constvol_vtx_backup);
        constvolumeaccept(vesicle,constvol_vtx_moved,constvol_vtx_backup);
    }
//   if(oldcellidx);
    //END MONTE CARLOOOOOOO
//    vesicle_volume(vesicle);
//    fprintf(stderr,"Volume after success=%1.16e\n", vesicle->volume);
    return TS_SUCCESS;
}