Exemple #1
0
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.")
Exemple #2
0
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.")
Exemple #3
0
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
Exemple #4
0
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