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
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
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)