def hook6(lattice): global nwateratoms lattice.logger.info("Hook6: Output water molecules in Yaplot format.") lattice.logger.info(" Total number of atoms: {0}".format( len(lattice.atoms))) # prepare the reverse dict waters = defaultdict(dict) for atom in lattice.atoms: resno, resname, atomname, position, order = atom if "O" in atomname: waters[order]["O"] = position elif "H" in atomname: if "H0" not in waters[order]: waters[order]["H0"] = position else: waters[order]["H1"] = position s = "" s += yp.Color(3) for order, water in waters.items(): O = water["O"] H0 = water["H0"] H1 = water["H1"] s += yp.Layer(4) s += yp.Color(3) s += yp.Size(0.03) s += yp.Circle(O) s += yp.Line(O, H0) s += yp.Line(O, H1) s += yp.Size(0.01) s += yp.Circle(H0) s += yp.Circle(H1) s += yp.Color(2) s += yp.Layer(1) s += yp.Text(O, "{0}".format(order)) s += yp.Layer(3) s += yp.Color(4) s += yp.ArrowType(1) s += yp.Size(0.03) for i, j in lattice.graph.edges(data=False): if i in waters and j in waters: # edge may connect to the dopant O = waters[j]["O"] H0 = waters[i]["H0"] H1 = waters[i]["H1"] d0 = H0 - O d1 = H1 - O rr0 = np.dot(d0, d0) rr1 = np.dot(d1, d1) if rr0 < rr1 and rr0 < 0.27**2: s += yp.Arrow(H0, O) if rr1 < rr0 and rr1 < 0.245**2: s += yp.Arrow(H1, O) print(s, end="") nwateratoms = len(lattice.atoms) lattice.logger.info("Hook6: end.")
def hook7(lattice): global nwateratoms lattice.logger.info("Hook7: Output water molecules in Yaplot format.") lattice.logger.info(" Total number of atoms: {0}".format( len(lattice.atoms))) gatoms = lattice.atoms[nwateratoms:] palettes = dict() s = "" s += yp.Layer(4) s += yp.ArrowType(1) H = [] O = "" for atom in gatoms: resno, resname, atomname, position, order = atom if atomname in palettes: pal = palettes[atomname] else: pal = 4 + len(palettes) palettes[atomname] = pal s += yp.Color(pal) s += yp.Size(0.04) s += yp.Circle(position) s = '#' + "\n#".join(lattice.doc) + "\n" + s print(s) lattice.logger.info("Hook7: end.")
def depolarize(spaceicegraph, cell, draw=None): """ Find a farthest atom (apsis) from the given atom, and make the shortest paths between them. It works much better than depolarize() """ logger = logging.getLogger() logger.debug(" isZ4: {0}".format(spaceicegraph.isZ4())) logger.debug(" defects: {0}".format(spaceicegraph.defects())) spaceicegraph.vector_check() s = "" # for yaplot while True: net_polar = spaceicegraph.net_polarization() logger.info(" Net polarization: {0}".format(net_polar)) if np.dot(net_polar, net_polar) < 0.2**2: break # without problem if -1 <= net_polar[0] <= 1 and -1 <= net_polar[ 1] <= 1 and -1 <= net_polar[2] <= 1: logger.info(" Gave up eliminating the polarization.") break if net_polar[0] > 1.0: logger.debug("Depolarize +X") axis = np.array([+1.0, 0.0, 0.0]) elif net_polar[0] < -1.0: logger.debug("Depolarize -X") axis = np.array([-1.0, 0.0, 0.0]) elif net_polar[1] > 1.0: logger.debug("Depolarize +Y") axis = np.array([0.0, +1.0, 0.0]) elif net_polar[1] < -1.0: logger.debug("Depolarize -Y") axis = np.array([0.0, -1.0, 0.0]) elif net_polar[2] > 1.0: logger.debug("Depolarize +Z") axis = np.array([0.0, 0.0, +1.0]) elif net_polar[2] < -1.0: logger.debug("Depolarize -Z") axis = np.array([0.0, 0.0, -1.0]) cycle = traversing_cycle(spaceicegraph, cell, axis, draw) if cycle is not None: edges = [(cycle[i], cycle[i + 1]) for i in range(len(cycle) - 1)] if len(edges) != len(set(edges)): logger.debug("The cycle is entangled.") else: if draw is not None: s += yp.Size(0.03) s += draw.draw_cell() s += draw.draw_path(cycle) s += yp.NewPage() spaceicegraph.invert_path(cycle) spaceicegraph.vector_check() logger.debug("isZ4: {0}".format(spaceicegraph.isZ4())) logger.debug("defects: {0}".format(spaceicegraph.defects())) return s
def depolarize(spaceicegraph, cell, draw=None): """ Find a farthest atom (apsis) from the given atom, and make the shortest paths between them. It works much better than depolarize() """ logger = logging.getLogger() logger.debug(" isZ4: {0}".format(spaceicegraph.isZ4())) logger.debug(" defects: {0}".format( spaceicegraph.bernal_fowler_defects())) spaceicegraph.vector_check() s = "" # for yaplot # TSL # defect-defect chains defects = [] for node in spaceicegraph.nodes(): if spaceicegraph.degree(node) != 4: assert spaceicegraph.degree(node) < 4 defects.append(node) logger.info(" Non Z4: {0}".format(defects)) if len(defects) > 0: reject_count = 10 while reject_count > 0: net_polar = spaceicegraph.net_polarization() # logger.info(" Net polarization: {0}".format(net_polar)) if np.dot(net_polar, net_polar) < 0.05**2: break # without problem while True: orig = defects[random.randint(0, len(defects) - 1)] if spaceicegraph.out_degree(orig) == 2: break while True: dest = defects[random.randint(0, len(defects) - 1)] if spaceicegraph.in_degree(dest) == 2: break path = shortest_path(spaceicegraph, orig, [ dest, ]) if path is None: continue logger.debug(" Dipole moment = {0}".format( spaceicegraph.dipole_moment(path))) new_net_polar = net_polar - spaceicegraph.dipole_moment(path) * 2 if np.linalg.norm(new_net_polar) < np.linalg.norm(net_polar): if draw is not None: s += yp.Size(0.03) s += draw.draw_cell() s += draw.draw_path(path) s += yp.NewPage() spaceicegraph.invert_path(path) ## chk_net_polar = spaceicegraph.net_polarization() net_polar = new_net_polar logger.info(" Net polarization: {0}".format(net_polar)) ## assert np.linalg.norm(new_net_polar - chk_net_polar) < 1e-5 ## logger.debug("New dipole {0}".format(new_net_polar)) ## logger.debug("Chk dipole {0}".format(chk_net_polar)) reject_count = 10 else: logger.debug(" Reject inversion") reject_count -= 1 while True: net_polar = spaceicegraph.net_polarization() logger.info(" Net polarization: {0}".format(net_polar)) if np.dot(net_polar, net_polar) < 0.2**2: break # without problem if -1 <= net_polar[0] <= 1 and -1 <= net_polar[ 1] <= 1 and -1 <= net_polar[2] <= 1: logger.info(" Gave up eliminating the polarization. (2)") break if net_polar[0] > 1.0: logger.debug("Depolarize +X") axis = np.array([+1.0, 0.0, 0.0]) elif net_polar[0] < -1.0: logger.debug("Depolarize -X") axis = np.array([-1.0, 0.0, 0.0]) elif net_polar[1] > 1.0: logger.debug("Depolarize +Y") axis = np.array([0.0, +1.0, 0.0]) elif net_polar[1] < -1.0: logger.debug("Depolarize -Y") axis = np.array([0.0, -1.0, 0.0]) elif net_polar[2] > 1.0: logger.debug("Depolarize +Z") axis = np.array([0.0, 0.0, +1.0]) elif net_polar[2] < -1.0: logger.debug("Depolarize -Z") axis = np.array([0.0, 0.0, -1.0]) cycle = traversing_cycle(spaceicegraph, cell, axis, draw) if cycle is not None: edges = [(cycle[i], cycle[i + 1]) for i in range(len(cycle) - 1)] if len(edges) != len(set(edges)): logger.debug("The cycle is entangled.") else: if draw is not None: s += yp.Size(0.03) s += draw.draw_cell() s += draw.draw_path(cycle) s += yp.NewPage() spaceicegraph.invert_path(cycle) spaceicegraph.vector_check() logger.debug("isZ4: {0}".format(spaceicegraph.isZ4())) logger.debug("defects: {0}".format(spaceicegraph.bernal_fowler_defects())) return s