/* 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
|