Example #1
0
    def _init_connectors(self):
        """Creates subdomain connectors for all subdomains connections."""
        # A set to keep track which connections are already created.
        _subdomain_conns = set()

        # IDs of the subdomains that are local to this master.
        local_subdomain_ids = set([b.id for b in self.subdomain_specs])
        local_subdomain_map = dict([(b.id, b) for b in self.subdomain_specs])
        ipc_files = []

        for subdomain in self.subdomain_specs:
            connecting_subdomains = subdomain.connecting_subdomains()
            for face, nbid in connecting_subdomains:
                if (subdomain.id, nbid) in _subdomain_conns:
                    continue

                _subdomain_conns.add((subdomain.id, nbid))
                _subdomain_conns.add((nbid, subdomain.id))

                cpair = subdomain.get_connection(face, nbid)
                size1 = cpair.src.elements
                size2 = cpair.dst.elements
                ctype = self._get_ctypes_float()

                opp_face = subdomain.opposite_face(face)
                if (opp_face, nbid) in connecting_subdomains:
                    size1 *= 2
                    size2 *= 2
                    face_str = '{0} and {1}'.format(face, opp_face)
                else:
                    face_str = str(face)

                self.config.logger.debug(
                    "Subdomain connection: {0} <-> {1}: {2}/{3}"
                    "-element buffer (face {4}).".format(
                        subdomain.id, nbid, size1, size2, face_str))

                if nbid in local_subdomain_ids:
                    c1, c2 = ZMQSubdomainConnector.make_ipc_pair(
                        ctype, (size1, size2), (subdomain.id, nbid))
                    subdomain.add_connector(nbid, c1)
                    ipc_files.append(c1.ipc_file)
                    local_subdomain_map[nbid].add_connector(subdomain.id, c2)
                else:
                    receiver = subdomain.id > nbid
                    if receiver:
                        addr = "tcp://{0}".format(
                            self._subdomain_addr_map[nbid])
                    else:
                        addr = "tcp://{0}".format(self._iface)
                    if self.config.compress_intersubdomain_data:
                        c1 = CompressedZMQRemoteSubdomainConnector(
                            addr, receiver=subdomain.id > nbid)
                    else:
                        c1 = ZMQRemoteSubdomainConnector(
                            addr, receiver=subdomain.id > nbid)
                    subdomain.add_connector(nbid, c1)

        return ipc_files
Example #2
0
    def _init_connectors(self):
        """Creates subdomain connectors for all subdomains connections."""
        # A set to keep track which connections are already created.
        _subdomain_conns = set()

        # IDs of the subdomains that are local to this master.
        local_subdomain_ids = set([b.id for b in self.subdomains])
        local_subdomain_map = dict([(b.id, b) for b in self.subdomains])
        ipc_files = []

        for subdomain in self.subdomains:
            connecting_subdomains = subdomain.connecting_subdomains()
            for face, nbid in connecting_subdomains:
                if (subdomain.id, nbid) in _subdomain_conns:
                    continue

                _subdomain_conns.add((subdomain.id, nbid))
                _subdomain_conns.add((nbid, subdomain.id))

                cpair = subdomain.get_connection(face, nbid)
                size1 = cpair.src.elements
                size2 = cpair.dst.elements
                ctype = self._get_ctypes_float()

                opp_face = subdomain.opposite_face(face)
                if (opp_face, nbid) in connecting_subdomains:
                    size1 *= 2
                    size2 *= 2
                    face_str = '{0} and {1}'.format(face, opp_face)
                else:
                    face_str = str(face)

                self.config.logger.debug("Subdomain connection: {0} <-> {1}: {2}/{3}"
                        "-element buffer (face {4}).".format(
                            subdomain.id, nbid, size1, size2, face_str))

                if nbid in local_subdomain_ids:
                    c1, c2 = ZMQSubdomainConnector.make_ipc_pair(ctype, (size1, size2),
                                                             (subdomain.id, nbid))
                    subdomain.add_connector(nbid, c1)
                    ipc_files.append(c1.ipc_file)
                    local_subdomain_map[nbid].add_connector(subdomain.id, c2)
                else:
                    receiver = subdomain.id > nbid
                    if receiver:
                        addr = "tcp://{0}".format(self._subdomain_addr_map[nbid])
                    else:
                        addr = "tcp://{0}".format(self._iface)
                    if self.config.compress_intersubdomain_data:
                        c1 = CompressedZMQRemoteSubdomainConnector(addr,
                                receiver=subdomain.id > nbid)
                    else:
                        c1 = ZMQRemoteSubdomainConnector(addr, receiver=subdomain.id > nbid)
                    subdomain.add_connector(nbid, c1)

        return ipc_files
Example #3
0
    def test_macro_transfer_2d(self):
        """Verifies that macroscopic fields are correctly exchanged between two
        2D subddomains."""
        b1 = SubdomainSpec2D((0, 0), (40, 40), id_=0)
        b2 = SubdomainSpec2D((0, 40), (40, 40), id_=1)
        b1.set_actual_size(envelope_size=1)
        b2.set_actual_size(envelope_size=1)

        # Establish connection between the two blocks.
        self.assertTrue(b1.connect(b2, grid=D2Q9))

        cpair = b1.get_connection(*b1.connecting_subdomains()[0])
        size1 = cpair.src.elements
        size2 = cpair.dst.elements
        c1, c2 = ZMQSubdomainConnector.make_ipc_pair(ctypes.c_float, (size1, size2), (b1.id, b2.id))
        b1.add_connector(b2.id, c1)
        b2.add_connector(b1.id, c2)

        # Create simulation object and block runnners.
        sim1 = LBBinaryFluidShanChen(self.config)
        sim2 = LBBinaryFluidShanChen(self.config)
        br1 = NNSubdomainRunner(sim1, b1, output=LBOutput(self.config, b1.id),
                backend=self.backend,
                quit_event=DummyEvent())
        br2 = NNSubdomainRunner(sim2, b2, output=LBOutput(self.config, b2.id),
                backend=self.backend,
                quit_event=DummyEvent())

        br1._init_shape()
        br2._init_shape()
        sim1.init_fields(br1)
        sim2.init_fields(br2)
        br1._init_buffers()
        br2._init_buffers()
        br1._init_streams()
        br2._init_streams()

        # Initialize a local IPC connection between the subdomains.
        c1.init_runner(self.ctx)
        c2.init_runner(self.ctx)

        # Verify transfer of the macroscopic fields.
        rho_cbuf, phi_cbuf = br1._block_to_macrobuf[1]
        rho = rho_cbuf.coll_buf.host
        phi = phi_cbuf.coll_buf.host
        rho[:] = np.mgrid[0:len(rho)]
        phi[:] = np.mgrid[100:100 + len(phi)]

        br1._send_macro()
        br2._recv_macro()

        rho_recv, phi_recv = br2._block_to_macrobuf[0]
        np.testing.assert_equal(rho_recv.recv_buf.host, rho)
        np.testing.assert_equal(phi_recv.recv_buf.host, phi)

        # Verify transfer of the distributions.
        f_cbuf, g_cbuf = br1._block_to_connbuf[1]
        fdist = f_cbuf.coll_buf.host
        gdist = g_cbuf.coll_buf.host
        fdist.flat = np.mgrid[0:len(fdist)]
        gdist.flat = np.mgrid[500:500 + len(gdist)]

        br1._send_dists()
        br2._recv_dists()

        f_recv, g_recv = br2._block_to_connbuf[0]
        np.testing.assert_equal(f_recv.recv_buf, fdist)
        np.testing.assert_equal(g_recv.recv_buf, gdist)

        os.unlink(c1.ipc_file)
Example #4
0
    def test_macro_transfer_2d(self):
        """Verifies that macroscopic fields are correctly exchanged between two
        2D subddomains."""
        b1 = SubdomainSpec2D((0, 0), (40, 40), id_=0)
        b2 = SubdomainSpec2D((0, 40), (40, 40), id_=1)
        b1.set_actual_size(envelope_size=1)
        b2.set_actual_size(envelope_size=1)

        # Establish connection between the two blocks.
        self.assertTrue(b1.connect(b2, grid=D2Q9))

        cpair = b1.get_connection(*b1.connecting_subdomains()[0])
        size1 = cpair.src.elements
        size2 = cpair.dst.elements
        c1, c2 = ZMQSubdomainConnector.make_ipc_pair(ctypes.c_float,
                                                     (size1, size2),
                                                     (b1.id, b2.id))
        b1.add_connector(b2.id, c1)
        b2.add_connector(b1.id, c2)

        # Create simulation object and block runnners.
        sim1 = LBBinaryFluidShanChen(self.config)
        sim2 = LBBinaryFluidShanChen(self.config)
        br1 = NNSubdomainRunner(sim1,
                                b1,
                                output=LBOutput(self.config, b1.id),
                                backend=self.backend,
                                quit_event=DummyEvent())
        br2 = NNSubdomainRunner(sim2,
                                b2,
                                output=LBOutput(self.config, b2.id),
                                backend=self.backend,
                                quit_event=DummyEvent())

        br1._init_shape()
        br2._init_shape()
        sim1.init_fields(br1)
        sim2.init_fields(br2)
        br1._init_buffers()
        br2._init_buffers()
        br1._init_streams()
        br2._init_streams()

        # Initialize a local IPC connection between the subdomains.
        c1.init_runner(self.ctx)
        c2.init_runner(self.ctx)

        # Verify transfer of the macroscopic fields.
        rho_cbuf, phi_cbuf = br1._block_to_macrobuf[1]
        rho = rho_cbuf.coll_buf.host
        phi = phi_cbuf.coll_buf.host
        rho[:] = np.mgrid[0:len(rho)]
        phi[:] = np.mgrid[100:100 + len(phi)]

        br1._send_macro()
        br2._recv_macro()

        rho_recv, phi_recv = br2._block_to_macrobuf[0]
        np.testing.assert_equal(rho_recv.recv_buf.host, rho)
        np.testing.assert_equal(phi_recv.recv_buf.host, phi)

        # Verify transfer of the distributions.
        f_cbuf, g_cbuf = br1._block_to_connbuf[1]
        fdist = f_cbuf.coll_buf.host
        gdist = g_cbuf.coll_buf.host
        fdist.flat = np.mgrid[0:len(fdist)]
        gdist.flat = np.mgrid[500:500 + len(gdist)]

        br1._send_dists()
        br2._recv_dists()

        f_recv, g_recv = br2._block_to_connbuf[0]
        np.testing.assert_equal(f_recv.recv_buf, fdist)
        np.testing.assert_equal(g_recv.recv_buf, gdist)

        os.unlink(c1.ipc_file)