fluid.py 2.34 KB
Newer Older
Jonathan Lambrechts's avatar
Jonathan Lambrechts committed
1
2
3
4
5
6
7
8
9
10
11
from ctypes import *
import numpy
import signal
import os

dir_path = os.path.dirname(os.path.realpath(__file__))
lib = CDLL(os.path.join(dir_path,"libmbfluid.so"))

signal.signal(signal.SIGINT, signal.SIG_DFL)


Jonathan Lambrechts's avatar
Jonathan Lambrechts committed
12
BNDCB = CFUNCTYPE(None,c_int,POINTER(c_double),POINTER(c_double))
Jonathan Lambrechts's avatar
Jonathan Lambrechts committed
13
class StrongBoundary(Structure):
Jonathan Lambrechts's avatar
Jonathan Lambrechts committed
14
    _fields_ = [("tag",c_char_p),("field",c_int),("apply",BNDCB)]
Jonathan Lambrechts's avatar
Jonathan Lambrechts committed
15
16
17

class fluid_problem :

18
    def __init__(self, mesh_file_name, mu, rho, alpha, autoEpsilon, strong_boundaries):
Jonathan Lambrechts's avatar
Jonathan Lambrechts committed
19
        nsb = len(strong_boundaries)
Jonathan Lambrechts's avatar
Jonathan Lambrechts committed
20
21
22
23
24
25
26
27
28
29
        def apply_bnd(n, xp, vp, b) :
            x = numpy.frombuffer(cast(xp, POINTER(int(n)*2*c_double)).contents)
            v = numpy.frombuffer(cast(vp, POINTER(int(n)*c_double)).contents)
            if callable(b) :
                v[:] = b(x)
            else :
                v[:] = b

        asb = (StrongBoundary*nsb)(*[StrongBoundary(i[0].encode(),i[1],BNDCB(lambda n,x,v : apply_bnd(n,x,v,i[2]))) for i in strong_boundaries])
        self.asb = asb
30
        lib.fluid_problem_new.restype = c_void_p
31
        self._fp = c_void_p(lib.fluid_problem_new(mesh_file_name.encode(), c_double(mu), c_double(rho), c_double(alpha), c_bool(autoEpsilon), nsb, asb))
Jonathan Lambrechts's avatar
Jonathan Lambrechts committed
32
33
34
35
36
37
38
        if self._fp == None :
            raise NameError("cannot create fluid problem")

    def __del__(self):
        if(self._fp != None) :
            lib.fluid_problem_free(self._fp)

39
40
    def adapt_mesh(self, gradmin, gradmax, lcmin, autoEpsilon) :
        lib.fluid_problem_adapt_mesh(self._fp, c_double(gradmin), c_double(gradmax), c_double(lcmin), c_bool(autoEpsilon))
Jonathan Lambrechts's avatar
Jonathan Lambrechts committed
41
42
43
44
45

    def export(self, output_dir, t, it) :
        lib.fluid_problem_export(self._fp, output_dir.encode(), c_double(t), c_int(it))

    def compute_node_force(self, dt) :
46
47
        def np2c(a) :
            return c_void_p(a.ctypes.data)
Jonathan Lambrechts's avatar
Jonathan Lambrechts committed
48
        forces = numpy.ndarray([self.n_particles,2],"d")
49
        lib.fluid_problem_compute_node_particle_force(self._fp, c_double(dt), np2c(forces))
Jonathan Lambrechts's avatar
Jonathan Lambrechts committed
50
51
52
53
54
55
        return forces

    def implicit_euler(self, dt) :
        lib.fluid_problem_implicit_euler(self._fp, c_double(dt))

    def set_particles(self, mass, volume, position, velocity):
56
57
        def np2c(a) :
            return c_void_p(numpy.ascontiguousarray(a).ctypes.data)
Jonathan Lambrechts's avatar
Jonathan Lambrechts committed
58
        self.n_particles = mass.shape[0]
59
        lib.fluid_problem_set_particles(self._fp,c_int(mass.shape[0]),np2c(mass),np2c(volume),np2c(position),np2c(velocity))