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(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 = self.factory.create('doubleArray')
        D.double.extend(dims)
        node_coord = self.factory.create('doubleArray')
        node_coord.double.extend(coords)

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

        OpenCL = kwargs.get('OpenCL',False)
        wrap_value = self.service.montecarlo(D,dim,node_coord,nof_nodes,f,q,
                                             walks,btol,threads,OpenCL)
        value = np.array(wrap_value.double,dtype=np.float_)

        est = Function(V)
        est.vector()[keys] = value
        mcbc = DirichletBC(V,est,interface)
        return mcbc, est