From 2c4278db6ead5c27e30a3000097ed898c968534e Mon Sep 17 00:00:00 2001 From: Samo Penic <samo.penic@gmail.com> Date: Sat, 09 Mar 2019 19:45:22 +0000 Subject: [PATCH] Added direct force plugin and fixes in stretching energy --- src/vertexmove.c | 177 +++++++++++++++++++++++++++++++++------------------------- 1 files changed, 101 insertions(+), 76 deletions(-) diff --git a/src/vertexmove.c b/src/vertexmove.c index da8e70f..362b895 100644 --- a/src/vertexmove.c +++ b/src/vertexmove.c @@ -1,3 +1,4 @@ +/* vim: set ts=4 sts=4 sw=4 noet : */ #include<stdlib.h> #include<math.h> #include "general.h" @@ -8,87 +9,60 @@ #include "energy.h" #include "timestep.h" #include "cell.h" -//#include "io.h" +#include "io.h" #include<stdio.h> #include "vertexmove.h" #include <string.h> +#include "constvol.h" +#include "plugins.h" ts_bool single_verticle_timestep(ts_vesicle *vesicle,ts_vertex *vtx,ts_double *rn){ ts_uint i; - ts_double dist; ts_bool retval; ts_uint cellidx; - ts_double delta_energy,oenergy,dvol=0.0; + ts_double delta_energy, oenergy; ts_double costheta,sintheta,phi,r; //This will hold all the information of vtx and its neighbours - ts_vertex backupvtx[20]; - 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)); - //Some stupid tests for debugging cell occupation! -/* cellidx=vertex_self_avoidance(vesicle, vtx); - if(vesicle->clist->cell[cellidx]==vtx->cell){ - fprintf(stderr,"Idx match!\n"); - } else { - fprintf(stderr,"***** Idx don't match!\n"); - fatal("ENding.",1); - } -*/ - - //temporarly moving the vertex -// vtx->x=vtx->x+vesicle->stepsize*(2.0*rn[0]-1.0); -// vtx->y=vtx->y+vesicle->stepsize*(2.0*rn[1]-1.0); -// vtx->z=vtx->z+vesicle->stepsize*(2.0*rn[2]-1.0); - - //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; - //distance with neighbours check - for(i=0;i<vtx->neigh_no;i++){ - dist=vtx_distance_sq(vtx,vtx->neigh[i]); - if(dist<1.0 || dist>vesicle->dmax) { - vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex)); - return TS_FAIL; +/* Entry point for plugin vm_hard_constraint() function */ + vesicle->plist->pointer=vesicle->plist->chain->vm_hard_constraint; + while(vesicle->plist->pointer!=NULL){ + retval = vesicle->plist->pointer->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; } - } - -// Distance with grafted poly-vertex check: - if(vtx->grafted_poly!=NULL){ - dist=vtx_distance_sq(vtx,vtx->grafted_poly->vlist->vtx[0]); - if(dist<1.0 || dist>vesicle->dmax) { - vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex)); - return TS_FAIL; - } + vesicle->plist->pointer=vesicle->plist->pointer->next; } +/* End of vm_hard_constraint() */ - //self avoidance check with distant vertices - cellidx=vertex_self_avoidance(vesicle, vtx); - //check occupation number - retval=cell_occupation_number_and_internal_proximity(vesicle->clist,cellidx,vtx); - - if(retval==TS_FAIL){ - vtx=memcpy((void *)vtx,(void *)&backupvtx[0],sizeof(ts_vertex)); - return TS_FAIL; - } - - - //if all the tests are successful, then energy for vtx and neighbours is calculated +/* Backuping the neighbours */ for(i=0;i<vtx->neigh_no;i++){ memcpy((void *)&backupvtx[i+1],(void *)vtx->neigh[i],sizeof(ts_vertex)); } - if(vesicle->pswitch == 1){ - for(i=0;i<vtx->tristar_no;i++) dvol-=vtx->tristar[i]->volume; - }; +/* Entry point for plugin vm_energy_before_prepare() */ - delta_energy=0; - //update the normals of triangles that share bead i. + vesicle->plist->pointer=vesicle->plist->chain->vm_energy_before_prepare; + while(vesicle->plist->pointer!=NULL){ + vesicle->plist->pointer->plugin->function->vm_energy_before_prepare(vesicle, vtx); + vesicle->plist->pointer=vesicle->plist->pointer->next; + } +/* End of vm_energy_before_prepare() */ + +//update the normals of triangles that share bead i. for(i=0;i<vtx->tristar_no;i++) triangle_normal_vector(vtx->tristar[i]); oenergy=vtx->energy; energy_vertex(vtx); @@ -100,10 +74,15 @@ delta_energy+=vtx->neigh[i]->xk*(vtx->neigh[i]->energy-oenergy); } - if(vesicle->pswitch == 1){ - for(i=0;i<vtx->tristar_no;i++) dvol+=vtx->tristar[i]->volume; - delta_energy-=vesicle->pressure*dvol; - }; +/* Entry point for plugin vm_energy_after_execute() */ + + vesicle->plist->pointer=vesicle->plist->chain->vm_energy_after_execute; + while(vesicle->plist->pointer!=NULL){ + delta_energy+=vesicle->plist->pointer->plugin->function->vm_energy_after_execute(vesicle, vtx, backupvtx); + vesicle->plist->pointer=vesicle->plist->pointer->next; + } +/* End of vm_energy_after_execute() */ + /* No poly-bond energy for now! if(vtx->grafted_poly!=NULL){ @@ -112,11 +91,33 @@ pow(sqrt(vtx_distance_sq(&backupvtx[0], vtx->grafted_poly->vlist->vtx[0])-1),2)) *vtx->grafted_poly->k; } */ + + +/* Entry point for plugin vm_before_montecarlo_constraint() function */ + vesicle->plist->pointer=vesicle->plist->chain->vm_before_montecarlo_constraint; + while(vesicle->plist->pointer!=NULL){ + retval = vesicle->plist->pointer->plugin->function->vm_before_montecarlo_constraint(vesicle,vtx, &backupvtx[0]); + if(retval==TS_FAIL){ + 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]); + return TS_FAIL; + } + vesicle->plist->pointer=vesicle->plist->pointer->next; + } +/* End of vm_before_montecarlo_constraint() */ + + + + + // fprintf(stderr, "DE=%f\n",delta_energy); //MONTE CARLOOOOOOOO if(delta_energy>=0){ #ifdef TS_DOUBLE_DOUBLE - if(exp(-delta_energy)< drand48() ) + if(exp(-delta_energy)< drand48()) #endif #ifdef TS_DOUBLE_FLOAT if(expf(-delta_energy)< (ts_float)drand48()) @@ -125,30 +126,48 @@ if(expl(-delta_energy)< (ts_ldouble)drand48()) #endif { - //not accepted, reverting changes +/*************************************************** MC step rejected **************************************************************/ 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)); } - //update the normals of triangles that share bead i. - for(i=0;i<vtx->tristar_no;i++) triangle_normal_vector(vtx->tristar[i]); + //update the normals of triangles that share bead i. + for(i=0;i<vtx->tristar_no;i++) triangle_normal_vector(vtx->tristar[i]); + + +/* Entry point for plugin vm_before_montecarlo_constraint() function */ + vesicle->plist->pointer=vesicle->plist->chain->vm_new_state_rejected; + while(vesicle->plist->pointer!=NULL){ + vesicle->plist->pointer->plugin->function->vm_new_state_rejected(vesicle,vtx, &backupvtx[0]); + vesicle->plist->pointer=vesicle->plist->pointer->next; + } +/* End of vm_before_montecarlo_constraint() */ + return TS_FAIL; } } - -// oldcellidx=vertex_self_avoidance(vesicle, &backupvtx[0]); +/*************************************************** MC step accepted **************************************************************/ + cellidx=vertex_self_avoidance(vesicle, vtx); if(vtx->cell!=vesicle->clist->cell[cellidx]){ retval=cell_add_vertex(vesicle->clist->cell[cellidx],vtx); -// if(retval==TS_SUCCESS) cell_remove_vertex(vesicle->clist->cell[oldcellidx],vtx); - if(retval==TS_SUCCESS) cell_remove_vertex(backupvtx[0].cell,vtx); - + if(retval==TS_SUCCESS) cell_remove_vertex(backupvtx[0].cell,vtx); } -// if(oldcellidx); - //END MONTE CARLOOOOOOO + +/* Entry point for plugin vm_before_montecarlo_constraint() function */ + vesicle->plist->pointer=vesicle->plist->chain->vm_new_state_accepted; + while(vesicle->plist->pointer!=NULL){ + vesicle->plist->pointer->plugin->function->vm_new_state_accepted(vesicle,vtx, &backupvtx[0]); + vesicle->plist->pointer=vesicle->plist->pointer->next; + } +/* End of vm_before_montecarlo_constraint() */ + return TS_SUCCESS; } + + + ts_bool single_poly_vertex_move(ts_vesicle *vesicle,ts_poly *poly,ts_vertex *vtx,ts_double *rn){ @@ -291,12 +310,18 @@ } } +// TODO: Maybe faster if checks only nucleus-neighboring cells +// Nucleus penetration check: + if (vtx->x*vtx->x + vtx->y*vtx->y + vtx->z*vtx->z < vesicle->R_nucleus){ + vtx=memcpy((void *)vtx,(void *)&backupvtx,sizeof(ts_vertex)); + return TS_FAIL; + } + //self avoidance check with distant vertices cellidx=vertex_self_avoidance(vesicle, vtx); //check occupation number retval=cell_occupation_number_and_internal_proximity(vesicle->clist,cellidx,vtx); - if(retval==TS_FAIL){ vtx=memcpy((void *)vtx,(void *)&backupvtx,sizeof(ts_vertex)); return TS_FAIL; -- Gitblit v1.9.3