Python wrapper for running instances of trisurf-ng
Samo Penic
2019-08-15 d5ddc0a56d9f52f27fb6edcc2fa1caf66fdb9eb0
commit | author | age
a4f8eb 1 from ctypes import *
SP 2
3 TS_SUCCESS=0
4 TS_FAIL=1
5
6 TS_ID_FILAMENT=1
7
8 TS_COORD_CARTESIAN=0
9 TS_COORD_SPHERICAL=1
10 TS_COORD_CYLINDRICAL=2
11
12
13 class ts_coord(Structure):
14     _fields_=[
15         ("e1", c_double),
16         ("e2", c_double),
17         ("e3", c_double),
18         ("coord_type", c_uint)
19         ]
20 class ts_vertex(Structure):
21     pass
22 class ts_bond(Structure):
23     pass
24 class ts_triangle(Structure):
25     pass
26 class ts_cell(Structure):
27     pass
28 class ts_poly(Structure):
29     pass
30 class ts_cluster(Structure):
31     pass
32 ts_vertex._fields_=[
33         ('idx',c_uint),
34         ('x',c_double),
35         ('y',c_double),
36         ('z',c_double),
37         ('neigh_no',c_uint),
38         ('neigh', POINTER(POINTER(ts_vertex))),
39         ('bond_length', POINTER(c_double)),
40         ('bond_length_dual',POINTER(c_double)),
41         ('curvature', c_double),
42         ('energy', c_double),
43         ('energy_h',c_double),
44         ('tristar_no', c_uint),
45         ('tristar', POINTER(POINTER(ts_triangle))),
46         ('bond_no',c_uint),
47         ('bond',POINTER(POINTER(ts_bond))),
48         ('cell',POINTER(ts_cell)),
49         ('xk',c_double),
50         ('c',c_double),
51         ('id', c_uint),
52         ('projArea',c_double),
53         ('relR', c_double),
54         ('solAngle', c_double),
55         ('grafted_poly', POINTER(ts_poly)),
56         ('cluster',POINTER(ts_cluster)),
57         ]
58 class ts_vertex_list(Structure):
59     _fields_=[('n',c_uint), ('vtx',POINTER(POINTER(ts_vertex)))]
60
61 ts_bond._fields_=[('idx',c_uint),
62         ('vtx1', POINTER(ts_vertex)),
63         ('vtx2', POINTER(ts_vertex)),
64         ('bond_length',c_double),
65         ('bond_length_dual',c_double),
66         ('tainted', c_char),
67         ('energy',c_double),
68         ('x',c_double),
69         ('y',c_double),
70         ('z',c_double),
71     ]
72 class ts_bond_list(Structure):
73     _fields_=[('n', c_uint),('bond',POINTER(POINTER(ts_bond)))]
74
75 ts_triangle._fields_=[
76         ('idx',c_uint),
77         ('vertex', POINTER(ts_vertex)*3),
78         ('neigh_no',c_uint),
79         ('neigh', POINTER(POINTER(ts_triangle))),
80         ('xnorm', c_double),
81         ('ynorm', c_double),
82         ('znorm', c_double),
83         ('area', c_double),
84         ('volume', c_double),
99c340 85         ('energy', c_double),
a4f8eb 86     ]
SP 87
88 class ts_triangle_list(Structure):
99c340 89     _fields_=[('n',c_uint),('a0',c_double),('tria', POINTER(POINTER(ts_triangle))),]
a4f8eb 90
SP 91
92 ts_cell._fields_=[
93     ('idx', c_uint),
94     ('vertex', POINTER(POINTER(ts_vertex))),
95     ('nvertex', c_uint),
96     ]        
97
98 class ts_cell_list(Structure):
99     _fields_=[
100         ('ncmax', c_uint*3),
101         ('cellno', c_uint),
102         ('cell',POINTER(POINTER(ts_cell))),
103         ('dcell', c_double),
104         ('shift', c_double),
105         ('max_occupancy', c_double),
106         ('dmin_interspecies', c_double)
107     ]
108
109 class ts_spharm(Structure):
110     _fields_=[
111         ('l',c_uint),
112         ('ulm', POINTER(POINTER(c_double))),
113     #    ('ulmComplex', POINTER(POINTER(gsl_complex))), #poisci!!!!
114         ('ulmComplex', POINTER(POINTER(c_double))), #temporary solution
115         ('sumUlm2', POINTER(POINTER(c_double))),
116         ('N', c_uint),
117         ('co',POINTER(POINTER(c_double))),
118         ('Ylmi', POINTER(POINTER(c_double))),
119         ]
120
121 ts_poly._fields_=[
122         ('vlist', POINTER(ts_vertex_list)),
123         ('blist', POINTER(ts_bond_list)),
124         ('grafted_vtx',POINTER(ts_vertex)),
125         ('k', c_double),
126     ]
127
128 class ts_poly_list(Structure):
129     _fields_=[('n',c_uint),('poly',POINTER(POINTER(ts_poly)))]
130
131 class ts_tape(Structure):
132     _fields_=[
133         ('nshell',c_long),
134         ('ncxmax',c_long),
135         ('ncymax',c_long),
136         ('nczmax',c_long),
137         ('npoly',c_long),
138         ('nmono',c_long),
139         ('internal_poly',c_long),
140         ('nfil',c_long),
141         ('nfono', c_long),
142         ('R_nucleus',c_long),
143         ('R_nucleusX',c_double),
144         ('R_nucleusY',c_double),
145         ('R_nucleusZ',c_double),
146         ('pswitch',c_long),
147         ('constvolswitch',c_long),
148         ('constareaswitch',c_long),
99c340 149         ('stretchswitch',c_long),
SP 150         ('xkA0',c_double),
a4f8eb 151         ('constvolprecision',c_double),
SP 152         ('multiprocessing',c_char_p),
153         ('brezveze0',c_long),
154         ('brezveze1',c_long),
155         ('brezveze2',c_long),
156         ('xk0',c_double),
157         ('dmax',c_double),
158         ('dmin_interspecies',c_double),
159         ('stepsize',c_double),
160         ('kspring',c_double),
161         ('xi',c_double),
162         ('pressure',c_double),
163         ('iterations',c_long),
164         ('inititer',c_long),
165         ('mcsweeps',c_long),
166         ('quiet',c_long),
167         ('shc',c_long),
168         ('number_of_vertice_with_c0',c_long),
169         ('c0', c_double),
170         ('w', c_double),
171         ('F', c_double),
172     ]
173         
174
175 class ts_vesicle(Structure):
176     _fields_=[
177         ('vlist', POINTER(ts_vertex_list)),
178         ('blist', POINTER(ts_bond_list)),
179         ('tlist', POINTER(ts_triangle_list)),
180         ('clist', POINTER(ts_cell_list)),
181         ('nshell', c_uint),
182         ('bending_rigidity',c_double),
183         ('dmax',c_double),
184         ('stepsize',c_double),
185         ('cm', c_double*3),
186         ('volume', c_double),
187         ('sphHarmonics',POINTER(ts_spharm)),
188         ('poly_list', POINTER(ts_poly_list)),
189         ('filament_list', POINTER(ts_poly_list)),
190         ('spring_constant', c_double),
191         ('pressure', c_double),
192         ('pswitch', c_int),
193         ('tape', POINTER(ts_tape)),
194         ('R_nucleus', c_double),
195         ('R_nucleusX', c_double),
196         ('R_nucleusY', c_double),
197         ('R_nucleusZ', c_double),
198         ('nucleus_center', c_double *3 ),
199         ('area', c_double),
200     ]
201
202 ts_cluster._fields_=[('nvtx',c_uint),('idx',c_uint),('vtx', POINTER(POINTER(ts_vertex)))]
203
204 class ts_cluster_list(Structure):
99c340 205     _fields_=[('n',c_uint),('cluster',POINTER(POINTER(ts_cluster)))]
a4f8eb 206
83999e 207
SP 208
209
210 ts=CDLL('libtrisurf.so')
a8e8b1 211
SP 212
213
214 #function call wrappers
215 def create_vesicle_from_tape(tape):
216     """Using pointer for tape, it creates a vesicle, returning pointer to it."""
d5ddc0 217     ts.create_vesicle_from_tape.argtypes=POINTER(ts_tape)
a8e8b1 218     ts.create_vesicle_from_tape.restype=POINTER(ts_vesicle)
SP 219     return ts.create_vesicle_from_tape(tape)
220
221 def parsetape(filename='tape'):
222     """Loads tape with  filename (if not given it defaults to 'tape'). It returns a pointer to structure for tape"""
223     ts.parsetape.restype=POINTER(ts_tape)
d5ddc0 224     ts.parsetape.argtypes=[c_char_p]
a8e8b1 225     return ts.parsetape(filename.encode('ascii'))
SP 226
227 def parseDump(filename):
228     """Loads a vtu file with 'filename' and creates a vesicle returning pointer to it"""
d5ddc0 229     ts.parseDump.argtypes=[c_char_p]
a8e8b1 230     ts.parseDump.restype=POINTER(ts_vesicle)
SP 231     vesicle=ts.parseDump(filename.encode('ascii'))
232     return vesicle
233
234 def single_timestep(vesicle):
235     """Makes a single timestep in simulations. Returns a tuple of vmsrt and bfrt (vertex move success rate and bond flip success rate)"""
d5ddc0 236     ts.single_timestep.argtypes=[POINTER(ts_vesicle),POINTER(c_double),POINTER(c_double)]
a8e8b1 237     vmsrt=c_double(0.0)
SP 238     bfsrt=c_double(0.0)
239     ts.single_timestep(vesicle,byref(vmsrt),byref(bfsrt))
240     return (vmsrt.value, bfsrt.value)
241
242 def write_vertex_xml_file(vesicle,timestep_no=0):
243     """Writes a vesicle into file with filename 'timestep_XXXXXX.vtu', where XXXXXX is a leading zeroed number given with timestep_no parameter (defaults to 0 if not given"""
d5ddc0 244     ts.write_vertex_xml_file.argtypess=[POINTER(ts_vesicle),c_int]
a8e8b1 245     ts.write_vertex_xml_file(vesicle,c_int(timestep_no))
SP 246
247
248 def vesicle_free(vesicle):
249     """Free memory of the whole vesicle"""
d5ddc0 250     ts.vesicle_free.argtypes=[POINTER(ts_vesicle)]
a8e8b1 251     ts.vesicle_free(vesicle)
SP 252
99c340 253 def vesicle_volume(vesicle):
d5ddc0 254     ts.vesicle_volume.argtypes=[POINTER(ts_vesicle)]
99c340 255     ts.vesicle_volume(vesicle)
a8e8b1 256
99c340 257 def vesicle_area(vesicle):
d5ddc0 258     ts.vesicle_area.argtypes=[POINTER(ts_vesicle)]
99c340 259     ts.vesicle_area(vesicle)
a8e8b1 260
99c340 261 def gyration_eigen(vesicle):
d5ddc0 262     ts.gyration_eigen.argtypes=[POINTER(ts_vesicle), POINTER(c_double), POINTER(c_double), POINTER(c_double)]
99c340 263     l1=c_double(0.0)
SP 264     l2=c_double(0.0)
265     l3=c_double(0.0)
266     ts.gyration_eigen(vesicle , byref(l1), byref(l2), byref(l3))
267     return (l1.value, l2.value, l3.value)
268
269 def vesicle_meancurvature(vesicle):
d5ddc0 270     ts.vesicle_meancurvature.argtypes=[POINTER(ts_vesicle)]
99c340 271     ts.vesicle_meancurvature.restype=c_double
SP 272     return ts.vesicle_meancurvature(vesicle)
273
274 def init_cluster_list():
275     ts.init_cluster_list.restype=POINTER(ts_cluster_list)
276     ret=ts.init_cluster_list()
277     return ret
278
279 def clusterize_vesicle(vesicle, cluster_list):
d5ddc0 280     ts.clusterize_vesicle.argtypes=[POINTER(ts_vesicle), POINTER(ts_cluster_list)]
99c340 281     ts.clusterize_vesicle(vesicle, cluster_list)
SP 282
283 def cluster_list_free(cluster_list):
284     """Free memory of cluster list"""
d5ddc0 285     ts.cluster_list_free.argtypes=[POINTER(ts_cluster_list)]
99c340 286     ts.cluster_list_free(cluster_list)
SP 287
288 def stretchenergy(vesicle, triangle):
d5ddc0 289     ts.stretchenergy.argtypes=[POINTER(ts_vesicle), POINTER(ts_triangle)]
99c340 290     ts.stretchenergy(vesicle,triangle)
SP 291
292 def get_absolute_ulm2(vesicle,l,m):
d5ddc0 293     ts.get_absolute_ulm2.argtypes=[POINTER(ts_vesicle), c_double, c_double]
99c340 294     ts.get_absolute_ulm2.restype=c_double
SP 295     ret=ts.get_absolute_ulm2(vesicle,l,m)
296     return ret
297
298 def getR0(vesicle):
d5ddc0 299     ts.getR0.argtypes=[POINTER(ts_vesicle)]
99c340 300     ts.getR0.restype=c_double
SP 301     r0=ts.getR0(vesicle)
302     return r0
303
304 def preparationSh(vesicle,r0):
d5ddc0 305     ts.preparationSh.argtypes=[POINTER(ts_vesicle), c_double]
SP 306     ts.preparationSh(vesicle,r0)
99c340 307
SP 308 def calculateUlmComplex(vesicle):
d5ddc0 309     ts.calculateUlmComplex.argtypes=[POINTER(ts_vesicle)]
99c340 310     ts.calculateUlmComplex(vesicle)
SP 311
d5ddc0 312
SP 313 def Ulm2Complex2String(vesicle):
314     ts.Ulm2Complex2String.argtypes=[POINTER(ts_vesicle)]
315     ts.Ulm2Complex2String.restype=c_char_p
316     string=ts.Ulm2Complex2String(vesicle)
317     return string
318
319 def freeUlm2String(string):
320     ts.freeUlm2String.argtypes=[c_char_p]
321     ts.freeUlm2String(string)
322
323
324 #This function seems not to exist!!!
325 #def solve_for_ulm2(vesicle):
326 #    ts.solve_for_ulm2.argtypes=[POINTER(ts_vesicle)]
327 #    ts.solve_for_ulm2(vesicle)
8f46a7 328
SP 329 def mean_curvature_and_energy(vesicle):
d5ddc0 330     ts.mean_curvature_and_energy.argtypes=[POINTER(ts_vesicle)]
8f46a7 331     ts.mean_curvature_and_energy(vesicle)    
SP 332