def montecarlo(self, V, interface, **kwargs):
        import _hybridmc as core

        dims = kwargs.get("Omega")
        bc = DirichletBC(V, 1.0, interface)
        coords, keys = tools.get_boundary_coords(bc)
        dim = len(dims)
        nof_nodes = len(coords) / dim
        D = np.array(dims, dtype=np.float_)
        node_coord = np.array(coords, dtype=np.float_)

        f = kwargs.get("f")
        q = kwargs.get("q")
        walks = kwargs.get("walks", 5000)
        btol = kwargs.get("btol", 1e-13)
        threads = kwargs.get("threads", 6)
        mpi_workers = kwargs.get("mpi_workers", 0)

        OpenCL = kwargs.get("OpenCL", False)
        if OpenCL and not core.opencl:
            print "****    WARNING    **** : Module %s compiled without OpenCL supprt. Recompile with -DOPENCL_SUPPORT" % (
                __name__
            )
            print "****    WARNING    **** : Running multithread CPU version"
            OpenCL = False
        if not OpenCL:
            f = Expression(f)
            q = Expression(q)
        value = core.montecarlo(D, dim, node_coord, nof_nodes, f, q, walks, btol, threads, mpi_workers)

        est = Function(V)
        est.vector()[keys] = value
        mcbc = DirichletBC(V, est, interface)
        return mcbc, est
 def montecarlo(ctx, dims, dim, coords, nof_nodes,f,q,walks,btol,threads,OpenCL):
     D = np.array(dims, dtype=np.float_)
     node_coord = np.array(coords, dtype=np.float_)
     if OpenCL and not core.opencl:
         print "****    WARNING    **** : Module %s compiled without OpenCL supprt. Recompile with -DOPENCL_SUPPORT" %(__name__)
         print "****    WARNING    **** : Running multithread CPU version"
         OpenCL = False
     if not OpenCL:
         f = Expression(f)
         q = Expression(q)
     value = core.montecarlo(D,dim,node_coord,nof_nodes,f,q,walks,btol,threads)
     return value