Trisurf Monte Carlo simulator
Samo Penic
2012-02-23 34d3de02dc183d38bf661789e98e43d9c1b4c0bd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include<stdlib.h>
#include<math.h>
#include "general.h"
#include "vertex.h"
#include "bond.h"
#include "triangle.h"
#include "vesicle.h"
#include "energy.h"
#include "timestep.h"
#include "cell.h"
//#include "io.h"
#include<stdio.h>
#include "vertexmove.h"
 
ts_bool single_verticle_timestep(ts_vesicle *vesicle,ts_vertex *vtx,ts_double
*rn){
    ts_uint i;
    ts_double dist;
    ts_vertex *tvtx=(ts_vertex *)malloc(sizeof(ts_vertex));
    tvtx->data=init_vertex_data();
    ts_bool retval; 
    ts_uint cellidx; 
    ts_double xold,yold,zold;
    ts_double delta_energy,oenergy;
    ts_vertex *ovtx;
 
    //randomly we move the temporary vertex
    tvtx->data->x=vtx->data->x+vesicle->stepsize*(2.0*rn[0]-1.0);
    tvtx->data->y=vtx->data->y+vesicle->stepsize*(2.0*rn[1]-1.0);
    tvtx->data->z=vtx->data->z+vesicle->stepsize*(2.0*rn[2]-1.0);
    //check we if some length to neighbours are too much
    for(i=0;i<vtx->data->neigh_no;i++){
        dist=vtx_distance_sq(tvtx,vtx->data->neigh[i]);
        if(dist<1.0 || dist>vesicle->dmax) return TS_FAIL;
    }
fprintf(stderr,"Was here!\n");
    //self avoidance check with distant vertices
     cellidx=vertex_self_avoidance(vesicle, tvtx);
    //check occupation number
     retval=cell_occupation_number_and_internal_proximity(vesicle->clist,cellidx,vtx,tvtx);
    if(retval==TS_FAIL){
        return TS_FAIL;
    } 
    
    //if all the tests are successful, then we update the vertex position
    xold=vtx->data->x;
    yold=vtx->data->y;
    zold=vtx->data->z;
    ovtx=malloc(sizeof(ts_vertex));
    vtx_copy(ovtx,vtx);
    vtx->data->x=tvtx->data->x;
    vtx->data->y=tvtx->data->y;
    vtx->data->z=tvtx->data->z;
 
    delta_energy=0;
    //update the normals of triangles that share bead i.
    for(i=0;i<vtx->data->tristar_no;i++) triangle_normal_vector(vtx->data->tristar[i]);
    //energy and curvature
    energy_vertex(vtx);
    delta_energy=vtx->data->xk*(vtx->data->energy - ovtx->data->energy);
    //the same is done for neighbouring vertices
    for(i=0;i<vtx->data->neigh_no;i++){
        oenergy=vtx->data->neigh[i]->data->energy;
        energy_vertex(vtx->data->neigh[i]);
        delta_energy+=vtx->data->neigh[i]->data->xk*(vtx->data->neigh[i]->data->energy-oenergy);
    }
    fprintf(stderr, "DE=%f\n",delta_energy);
    //MONTE CARLOOOOOOOO
    if(delta_energy>=0){
#ifdef TS_DOUBLE_DOUBLE
        if(exp(-delta_energy)< drand48() )
#endif
#ifdef TS_DOUBLE_FLOAT
        if(expf(-delta_energy)< (ts_float)drand48())
#endif
#ifdef TS_DOUBLE_LONGDOUBLE
        if(expl(-delta_energy)< (ts_ldouble)drand48())
#endif
    {
    //not accepted, reverting changes
    vtx->data->x=xold;
    vtx->data->y=yold;
    vtx->data->z=zold;
    //update the normals of triangles that share bead i.
    for(i=0;i<vtx->data->tristar_no;i++) triangle_normal_vector(vtx->data->tristar[i]);
    //energy and curvature
    energy_vertex(vtx);
    //the same is done for neighbouring vertices
    for(i=0;i<vtx->data->neigh_no;i++) energy_vertex(vtx->data->neigh[i]);
  free(ovtx->data->bond_length);
    free(ovtx->data->bond_length_dual);
    free(ovtx);
    return TS_FAIL; 
    }
}
    //END MONTE CARLOOOOOOO
 
    //TODO: change cell occupation if necessary!
 
    free(ovtx->data->bond_length);
    free(ovtx->data->bond_length_dual);
    free(ovtx);
    return TS_SUCCESS;
}