Trisurf Monte Carlo simulator
Samo Penic
2010-11-28 9802f169c159d66159bc15fce86c4aaa3c9e9ce5
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include "general.h"
#include "vertex.h"
#include "bond.h"
#include<stdio.h>
 
ts_vertex_list *init_vertex_list(ts_uint N){    
    ts_int i;
    ts_vertex *tlist;
    ts_vertex_list *vlist=(ts_vertex_list *)malloc(sizeof(ts_vertex_list));
    
    if(N==0){
        err("Initialized vertex list with zero elements. Pointer set to NULL");
        vlist->n=0;
        vlist->vtx=NULL;
        return vlist;
    }
    
    vlist->vtx=(ts_vertex **)malloc(N*sizeof(ts_vertex *));
    tlist=(ts_vertex *)malloc(N*sizeof(ts_vertex));
    if(vlist->vtx==NULL || tlist==NULL)
        fatal("Fatal error reserving memory space for vertex list! Could number of requsted vertices be too large?", 100);
    for(i=0;i<N;i++) {
        vlist->vtx[i]=&tlist[i];
        vlist->vtx[i]->data=init_vertex_data();
        vlist->vtx[i]->idx=i;
    }
    vlist->n=N;
    return vlist;
}
 
ts_vertex_data *init_vertex_data(){
    ts_vertex_data *data;
    data=(ts_vertex_data *)calloc(1,sizeof(ts_vertex_data));
    if(data==NULL)
        fatal("Fatal error reserving memory space for ts_vertex! Memory full?", 100);
    return data;
}
 
/*
ts_bool vtx_set_global_values(ts_vertex **vlist, ts_vesicle *vesicle){
    ts_double xk=vesicle->bending_rigidity;
    ts_uint i;
    for(i=0;i<vesicle->vlist.n;i++){
        vlist[i]->xk=xk;
    }
    return TS_SUCCESS;
}
*/
 
 
 
ts_bool vtx_add_neighbour(ts_vertex *vtx, ts_vertex *nvtx){
    ts_uint i;
    /* no neighbour can be null! */
    if(vtx==NULL || nvtx==NULL) return TS_FAIL;
    
    /*if it is already a neighbour don't add it to the list */
    for(i=0; i<vtx->data->neigh_no;i++){
        if(vtx->data->neigh[i]==nvtx) return TS_FAIL;
    }
    ts_uint nn=++vtx->data->neigh_no;
    vtx->data->neigh=(ts_vertex **)realloc(vtx->data->neigh, nn*sizeof(ts_vertex *));
    vtx->data->neigh[nn-1]=nvtx;
 
    /* pa se sosedu dodamo vertex */
    /*if it is already a neighbour don't add it to the list */
    for(i=0; i<nvtx->data->neigh_no;i++){
        if(nvtx->data->neigh[i]==vtx) return TS_FAIL;
    } 
    nn=++nvtx->data->neigh_no;
    nvtx->data->neigh=(ts_vertex **)realloc(nvtx->data->neigh, nn*sizeof(ts_vertex *));
    nvtx->data->neigh[nn-1]=vtx;
 
 
    return TS_SUCCESS;
}
 
/* TODO: optimize this. test this. */
ts_bool vtx_remove_neighbour(ts_vertex *vtx, ts_vertex *nvtx){
/* find a neighbour */
/* remove it from the list while shifting remaining neighbours up */
    ts_uint i,j=0;
    for(i=0;i<vtx->data->neigh_no;i++){
        if(vtx->data->neigh[i]!=nvtx){
            vtx->data->neigh[j]=vtx->data->neigh[i];
            j++;
        }
    }
/* resize memory. potentionally time consuming */
    vtx->data->neigh_no--;
    vtx->data->neigh=(ts_vertex **)realloc(vtx->data->neigh,vtx->data->neigh_no*sizeof(ts_vertex *));
    if(vtx->data->neigh == NULL && vtx->data->neigh_no!=0)
        fatal("Reallocation of memory failed during removal of vertex neighbour in vtx_remove_neighbour",100);
 
/* repeat for the neighbour */
/* find a neighbour */
/* remove it from the list while shifting remaining neighbours up */
    for(i=0;i<nvtx->data->neigh_no;i++){
        if(nvtx->data->neigh[i]!=vtx){
            nvtx->data->neigh[j]=nvtx->data->neigh[i];
            j++;
        }
    }
/* resize memory. potentionally time consuming. */
    nvtx->data->neigh_no--;
    nvtx->data->neigh=(ts_vertex **)realloc(nvtx->data->neigh,nvtx->data->neigh_no*sizeof(ts_vertex *));
    if(nvtx->data->neigh == NULL && nvtx->data->neigh_no!=0)
        fatal("Reallocation of memory failed during removal of vertex neighbour in vtx_remove_neighbour",100);
 
    return TS_SUCCESS;
}
 
 
ts_bool vtx_add_bond(ts_bond_list *blist,ts_vertex *vtx1,ts_vertex *vtx2){
    ts_bond *bond;
    bond=bond_add(blist,vtx1,vtx2);
    if(bond==NULL) return TS_FAIL;
    vtx1->data->bond_no++;
    vtx2->data->bond_no++;
 
    vtx1->data->bond=(ts_bond **)realloc(vtx1->data->bond, vtx1->data->bond_no*sizeof(ts_bond *)); 
    vtx2->data->bond=(ts_bond **)realloc(vtx2->data->bond, vtx2->data->bond_no*sizeof(ts_bond *)); 
    vtx1->data->bond[vtx1->data->bond_no-1]=bond;
    vtx2->data->bond[vtx2->data->bond_no-1]=bond;
    return TS_SUCCESS;
}
 
ts_bool vtx_add_cneighbour(ts_bond_list *blist, ts_vertex *vtx1, ts_vertex *vtx2){
    ts_bool retval;
    retval=vtx_add_neighbour(vtx1,vtx2);
    if(retval==TS_SUCCESS)
    retval=vtx_add_bond(blist,vtx1,vtx2); 
    return retval;
}
 
/*TODO: write and optimize this urgently before use! */
ts_bool vtx_remove_cneighbour(ts_bond_list *blist, ts_vertex *vtx1, ts_vertex
*vtx2){
//    ts_bool retval;
/* remove the bond */
//retval=vtx_remove_bond(blist,vtx1,vtx2);
/* remove the vertices */
    return TS_SUCCESS;
}
 
 
 
ts_bool vtx_data_free(ts_vertex_data *data){
    if(data->neigh!=NULL)   free(data->neigh);
    if(data->tristar!=NULL) free(data->tristar);
    if(data->bond!=NULL)    free(data->bond);
    if(data->cell!=NULL)    free(data->cell);
    free(data);
    return TS_SUCCESS;
}
 
/*not usable. can be deleted */
ts_bool vtx_free(ts_vertex  *vtx){
    vtx_data_free(vtx->data);
    free(vtx);
    return TS_SUCCESS;
}
 
ts_bool vtx_list_free(ts_vertex_list *vlist){
    int i;
    for(i=0;i<vlist->n;i++){
        vtx_data_free(vlist->vtx[i]->data);
    }
    free(*(vlist->vtx));
    free(vlist->vtx);
    free(vlist);
    return TS_SUCCESS;
}
 
 
 
/* rewrite for additional structure in chain */
/*inline ts_double vtx_distance_sq(ts_vertex *vtx1, ts_vertex *vtx2){
    ts_double dist;
#ifdef TS_DOUBLE_DOUBLE
    dist=pow((*vtx1)->x-(*vtx2)->x,2) + pow((*vtx1)->y-(*vtx2)->y,2) + pow((*vtx1)->z-(*vtx2)->z,2);
#endif
#ifdef TS_DOUBLE_LONGDOUBLE
    dist=powl((*vtx1)->x-(*vtx2)->x,2) + powl((*vtx1)->y-(*vtx2)->y,2) + powl((*vtx1)->z-(*vtx2)->z,2);
#endif
#ifdef TS_DOUBLE_FLOAT
    dist=powf((*vtx1)->x-(*vtx2)->x,2) + powf((*vtx1)->y-(*vtx2)->y,2) + powf((*vtx1)->z-(*vtx2)->z,2);
#endif
    return(dist);
}
*/