Trisurf Monte Carlo simulator
Samo Penic
2019-03-08 6dab1ac322cfbad8390861456c674922073911b3
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
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
/* vim: set ts=4 sts=4 sw=4 noet : */
#ifndef _GENERAL_H
#define _GENERAL_H
 
#include<stdarg.h>
#include<stdio.h>
#include<gsl/gsl_complex.h>
/* @brief This is a header file, defining general constants and structures.
  * @file header.h
  * @author Samo Penic
  * @date 5.3.2001
  * 
  * Header file for general inclusion in all the code, defining data structures
  * and general constans. All datatypes used in the code is also defined here.
  *
  * Miha: branch trisurf-polyel
  */
 
/* Defines */
/** @brief Return value of type bz_bool that indiceates successful function finish 
  *
  * Function usualy return some value, which are the result of certain operation. Functions that don't
  * return any parameters can return value, that indicates if the function call finished successfully.
  * In case of successful function run, the functions should return TS_SUCCESS to the caller. This define
  * is set here to get uniformity among all the functions used in program.
  *
  * Example of usage:
  *        ts_boot somefunction(ts_int param1, ....){
  *            ...
  *            return TS_SUCCESS;
  *        }
  */
#define TS_SUCCESS 0
 
/** @brief Return value of type bz_bool that indicates unsuccessful function finish 
  *
  * Function usualy return some value, which are the result of certain operation. Functions that don't
  * return any parameters can return value, that indicates if the function call finished successfully.
  * In case of unsuccessful function run, the functions should return TS_FAIL to the caller. This define
  * is set here to get uniformity among all the functions used in program.
  *
  * Example of usage:
  *
  *        ts_boot somefunction(ts_int param1, ....){
  *            ...
  *            return TS_FAIL;
  *        }
  */
#define TS_FAIL 1
 
/* CONSTANTS */
 
#define TS_ID_FILAMENT 1
 
/* DATA TYPES */
/** @brief Sets the default datatype for ts_double
 *
 * Requred for some functions to work, like "pow" from math.h. If ts_double is defined as
 * float program must run with "powf". Where type dependant function is used it checks this
 * define directive to decide which version to compile in. Available options
 *
 *    TS_DOUBLE_FLOAT
 *    TS_DOUBLE_DOUBLE
 *    TS_DOUBLE_LONGDOUBLE
*/
#define TS_DOUBLE_DOUBLE
 
/** For the purpose of greater flexibility all data types used in the program
 *  shouldn't use standard C types, but should use types defined here.
 *    ts_int (uses int)
 */
typedef int ts_int;
/** For the purpose of greater flexibility all data types used in the program
 *  shouldn't use standard C types, but should use types defined here.
 *    ts_uint (uses unsigned int)
 */
typedef unsigned int ts_uint;
/** For the purpose of greater flexibility all data types used in the program
 *  shouldn't use standard C types, but should use types defined here.
 *    ts_long (uses long)
 */
typedef long ts_long;
/** For the purpose of greater flexibility all data types used in the program
 *  shouldn't use standard C types, but should use types defined here.
 *    ts_ulong (uses unsigned long)
 */
typedef unsigned long ts_ulong;
/** For the purpose of greater flexibility all data types used in the program
 *  shouldn't use standard C types, but should use types defined here.
 *    ts_float (uses float)
 */
typedef float ts_float;
/** For the purpose of greater flexibility all data types used in the program
 *  shouldn't use standard C types, but should use types defined here.
 *    ts_double (uses double)
 */
typedef double ts_double;
/** For the purpose of greater flexibility all data types used in the program
 *  shouldn't use standard C types, but should use types defined here.
 *    ts_char (uses char)
 */
typedef char ts_char;
/** For the purpose of greater flexibility all data types used in the program
 *  shouldn't use standard C types, but should use types defined here.
 *    ts_uchar (uses unsigned char)
 */
typedef unsigned char ts_uchar;
/** For the purpose of greater flexibility all data types used in the program
 *  shouldn't use standard C types, but should use types defined here.
 *    ts_bool (uses char)
 */
typedef char ts_bool;
 
 
/* STRUCTURES */
 
 
/** @brief Data structure for keeping the coordinates in selected coordinate
 * system
 */
#define TS_COORD_CARTESIAN 0
#define TS_COORD_SPHERICAL 1
#define TS_COORD_CYLINDRICAL 2
 
typedef struct {
    ts_double e1;
    ts_double e2;
    ts_double e3;
    ts_uint coord_type;
} ts_coord;
 
/** @brief Data structure of all data connected to a vertex
 *
 *  ts_vertex holds the data for one single point (bead, vertex). To understand how to use it
 *  here is a detailed description of the fields in the data structure. */
struct ts_vertex {
        ts_uint idx;
        ts_double x; /**< The x coordinate of vertex. */
        ts_double y; /**< The y coordinate of vertex. */
        ts_double z; /**< The z coordinate of vertex. */
        ts_uint neigh_no; /**< The number of neighbours. */
        struct ts_vertex **neigh; /**< The pointer that holds neigh_no pointers to this structure. */
        ts_double *bond_length; /**< Obsolete! The bond lenght is moved to ts_bond */
        ts_double *bond_length_dual; /**< Obsolete! Bond length in dual lattice is moved to ts_bond! */
        ts_double curvature;
        ts_double energy;
        ts_double energy_h;
        ts_uint tristar_no;
        struct ts_triangle **tristar; /**< The list of triangles this vertex belongs to. This is an array of pointers to ts_triangle structure of tristar_no length */
        ts_uint bond_no;
        struct ts_bond **bond; /**< Array of pointers of lenght bond_no that stores information on bonds. */
        struct ts_cell *cell; /**< Which cell do we belong to? */
        ts_double xk;
        ts_double c;
        ts_uint id;
        ts_double projArea;
        ts_double relR;
        ts_double solAngle;
        struct ts_poly *grafted_poly;
        struct ts_cluster *cluster;
};
typedef struct ts_vertex ts_vertex;
 
typedef struct {
    ts_uint n;
    ts_vertex **vtx;
 
} ts_vertex_list;
 
struct ts_bond {
        ts_uint idx;
    ts_vertex *vtx1;
    ts_vertex *vtx2;
        ts_double bond_length;
        ts_double bond_length_dual;
    ts_bool tainted; //TODO: remove
    ts_double energy;
    ts_double x,y,z;
};
typedef struct ts_bond ts_bond;
 
struct ts_bond_list {
    ts_uint n;
    ts_bond **bond;
};
typedef struct ts_bond_list ts_bond_list;
 
struct ts_triangle {
    ts_uint idx;
    ts_vertex *vertex[3];
    ts_uint neigh_no;
    struct ts_triangle **neigh;
    ts_double xnorm;
    ts_double ynorm;
    ts_double znorm;
    ts_double area; // firstly needed for sh.c
    ts_double volume; // firstly needed for sh.c
    ts_double energy;
};
typedef struct ts_triangle ts_triangle;
 
struct ts_triangle_list{
    ts_uint n;
    ts_double a0;
    ts_triangle **tria;
};
typedef struct ts_triangle_list ts_triangle_list;
 
 
typedef struct ts_cell {
    ts_uint idx;
    ts_vertex **vertex;
    ts_uint nvertex;
} ts_cell; 
 
typedef struct ts_cell_list{
    ts_uint ncmax[3];
    ts_uint cellno;
    ts_cell **cell;
    ts_double dcell;
    ts_double shift;
    ts_double max_occupancy;
    ts_double dmin_interspecies;
} ts_cell_list;
 
 
typedef struct {
    ts_uint l;
    ts_double **ulm;
    gsl_complex **ulmComplex;
    ts_double **sumUlm2;
    ts_uint N;
    ts_double **co;
    ts_double ***Ylmi;
} ts_spharm;
 
 
 
struct ts_poly {
    ts_vertex_list *vlist;
    ts_bond_list *blist;
    ts_vertex *grafted_vtx;
    ts_double k;
};
typedef struct ts_poly ts_poly;
 
 
struct ts_poly_list {
    ts_uint    n;
    ts_poly **poly;
};
typedef struct ts_poly_list ts_poly_list;
 
 
typedef struct{
    ts_float z_max;
    ts_float z_min;
    ts_int force_switch;
} ts_confinement_plane;
 
typedef struct {
    long int nshell;
    long int ncxmax;
    long int ncymax;
    long int nczmax;
    long int npoly;
    long int nmono;
    long int internal_poly;
    long int nfil;
    long int nfono;
    long int R_nucleus;
    ts_double R_nucleusX;
    ts_double R_nucleusY;
    ts_double R_nucleusZ;
    long int pswitch;
    long int constvolswitch;
    long int constareaswitch;
    long int stretchswitch;
    ts_double xkA0;
    ts_double constvolprecision;
        char *multiprocessing;
       long int brezveze0;
        long int brezveze1;
        long int brezveze2;
        ts_double xk0;
    ts_double dmax;
    ts_double dmin_interspecies;
    ts_double stepsize;
    ts_double kspring;
    ts_double xi;
    ts_double pressure;
    long int iterations;
    long int inititer;
    long int mcsweeps;
    long int quiet;
    long int shc;
    long int number_of_vertices_with_c0;
    ts_double c0;
    ts_double w;
    ts_double F;
    long int plane_confinement_switch;
    ts_double plane_d;
    ts_double plane_F;
} ts_tape;
 
 
/* plugins */
typedef struct {
    void (*at_start)(int argc, char **argv);
    void *(*after_vesicle_init)(void *vesicle);
    ts_bool (*vm_hard_constraint)(void *vesicle, ts_vertex *vtx, ts_vertex *odl_vtx);
    void (*vm_energy_before_prepare)(void *vesicle, ts_vertex *vtx);
    ts_double (*vm_energy_before_execute)(void *vesicle, ts_vertex *vtx);
    ts_double (*vm_energy_after_prepare)(void *vesicle, ts_vertex *vtx);
    ts_double (*vm_energy_after_execute)(void *vesicle, ts_vertex *vtx);
    ts_double (*vm_before_montecarlo_constraint)(void *vesicle, ts_vertex *vtx, ts_vertex *old_vtx);
    ts_double (*vm_new_state_accepted)(void *vesicle, ts_vertex *vtx, ts_vertex *old_vtx);
    ts_double (*vm_new_state_rejected)(void *vesicle, ts_vertex *vtx, ts_vertex *old_vtx);
    void (*cleanup)(void);
} ts_plugin_function;
 
typedef struct {
    ts_char *name;
    ts_char *description;
    ts_char *author;
    void *data;
} ts_plugin_details;
 
typedef struct {
    ts_plugin_details *details;
    ts_plugin_function *function;
    ts_char *filename;
    void *libhandle;
} ts_plugin;
 
struct ts_plugin_chain {
    ts_plugin *plugin;
    struct ts_plugin_chain *next;
};
typedef struct ts_plugin_chain ts_plugin_chain;
 
typedef struct {
    ts_plugin_chain *at_start;
    ts_plugin_chain *after_vesicle_init;
    ts_plugin_chain *vm_hard_constraint;
    ts_plugin_chain *vm_energy_before_prepare;
    ts_plugin_chain *vm_energy_after_execute;
    ts_plugin_chain *vm_before_montecarlo_constraint;
    ts_plugin_chain *vm_new_state_accepted;
    ts_plugin_chain *vm_new_state_rejected;
    ts_plugin_chain *cleanup;
} ts_plugin_chains;
 
 
typedef struct {
    ts_uint n;
    ts_plugin **plugin;
    ts_plugin_chains *chain;
    ts_plugin_chain *pointer;
} ts_plugin_list;
 
/* end plugins */
 
 
typedef struct {
    ts_vertex_list *vlist;
    ts_bond_list *blist;
    ts_triangle_list *tlist;
    ts_cell_list *clist;
    ts_uint nshell;
    ts_double bending_rigidity;
    ts_double dmax;
    ts_double stepsize;
       ts_double cm[3];
    ts_double volume;
    ts_spharm *sphHarmonics;
// Polymers outside the vesicle and attached to the vesicle membrane (polymer brush):
    ts_poly_list *poly_list;
// Filaments inside the vesicle (not attached to the vesicel membrane:
    ts_poly_list *filament_list;
 
    ts_double spring_constant;
    ts_double pressure;
    ts_int pswitch;
     ts_tape *tape;
    ts_double R_nucleus;
    ts_double R_nucleusX;
    ts_double R_nucleusY;
    ts_double R_nucleusZ;
    ts_double nucleus_center[3];
    ts_double area;
    ts_confinement_plane confinement_plane;
    ts_plugin_list *plist;
} ts_vesicle;
 
 
 
struct ts_cluster{
    ts_uint nvtx;
    ts_uint idx;
    ts_vertex **vtx;
};
 
typedef struct ts_cluster ts_cluster;
 
typedef struct{
    ts_uint n;
    ts_cluster **cluster;
} ts_cluster_list;
 
 
/* GLOBAL VARIABLES */
 
int quiet;
ts_double V0;
ts_double A0;
ts_double epsvol;
ts_double epsarea;
/* FUNCTIONS */
 
/** Non-fatal error function handler:
 *      @param text is a description of an error
 *      @returns doesn't return anything
*/
void err(char *text);
 
/** Fatal error function handler:
 *      @param text is a description of an error
 *      @param errcode is a (non-zero) error code
 *      @returns terminates the execution of program with errcode set
*/
void fatal(char *text, ts_int errcode);
 
ts_uint ts_fprintf(FILE *fd, char *fmt, ...);
 
#define VTX(n) &(vlist->vtx[n])
#define VTX_DATA(n) vlist->vtx[n].data
 
 
/* FOR PID GENERATION ROUTINE */
#define CPF_CLOEXEC 1
 
int createPidFile(const char *progName, const char *pidFile, int flags);
 
int lockRegion(int fd, int type, int whence, int start, int len);
char *libVersion();
#endif