Exemplo n.º 1
0
    L.fix("nveintegration", "clustergr",
          "nve")  # move only cluster atoms and surface substrate atoms

    starttime = time.time()
    L.run(20000)
    print("dt at start: {} fs".format(L.eval("dt") * 1000))
    print("T at start: {} K".format(L.eval("temp")))
    print("elapsed time: {} s".format(time.time() - starttime))
    L.unfix("thermofix2")

    #initial equilibration procedure finished:
    print("****************************************")
    print("initial equilibration procedure finished, writing restart file")
    print("****************************************")

    L.write_restart("restart.equil")
    L.write_restart("restartfromprevdispl.equil")
else:
    L.read_restart("restart.equil")

L.velocity("all", "create", Temp, 12345, "dist", "gaussian", "mom", "yes",
           "rot", "yes")
#L.fix("mainvartimestep","clustergr","dt/reset",10,"NULL","NULL",latticeconst/30,"emax",0.1,"units","box")
L.fix("mainvartimestep", "clustergr", "dt/reset", 1, "NULL", "NULL", 0.1,
      "units", "box")
L.fix("linmomfix", "clustergr", "momentum", 1, "linear", 1, 1,
      1)  # remove linear momentum for better displacement detection

#L.fix("thermofix3","clustergr","langevin",Temp,Temp,0.05, 2614,"zero","yes")
#L.fix("thermofix3","clustergr","temp/csvr",Temp,Temp,0.1,12345)
Exemplo n.º 2
0
def elastic():
    """ Compute elastic constant tensor for a crystal

     In order to calculate the elastic constants correctly, care must be taken to specify
     the correct units (units). It is also  important to verify that the minimization of energy
     w.r.t atom  positions in the deformed cell is fully converged.
     One indication of this is that the elastic constants are insensitive
     to the choice of the variable ${up}. Another is to check
     the final max and two-norm forces reported in the log file. If you know
     that minimization is not required, you can set maxiter = 0.0 """

    parser = ArgumentParser(
        description=
        'A python script to compute elastic properties of bulk materials')

    parser.add_argument("input_data_file",
                        help="The full path & name of the lammps data file.")
    parser.add_argument(
        "kim_model",
        help="the KIM ID of the interatomic model archived in OpenKIM")
    parser.add_argument(
        "elements",
        nargs='+',
        default=['Au'],
        help=
        "a list of N chemical species, which defines a mapping between atom types in LAMMPS to the available species in the OpenKIM model"
    )
    parser.add_argument(
        "--min_style",
        default="cg",
        help="which algorithm will be used for minimization from lammps")
    parser.add_argument("--minimize",
                        type=float,
                        nargs=4,
                        default=[1.0e-4, 1.0e-6, 100, 1000],
                        help="minimization parameters")
    parser.add_argument("--up",
                        type=float,
                        default=1.0e-6,
                        help="the deformation magnitude (in strain units)")
    args = parser.parse_args()

    L = PyLammps()

    L.units("metal")

    # Define the finite deformation size.
    #Try several values to verify that results do not depend on it.
    L.variable("up equal {}".format(args.up))

    # Define the amount of random jiggle for atoms. It prevents atoms from staying on saddle points
    atomjiggle = 1.0e-5

    # metal units, elastic constants in GPa
    cfac = 1.0e-4

    # Define minimization parameters
    L.variable("dmax equal 1.0e-2")

    L.boundary("p", "p",
               "p")  # periodic boundary conditions in all three directions
    L.box(
        "tilt large"
    )  # to avoid termination if the final simulation box has a high tilt factor

    # use the OpenKIM model to set the energy interactions
    L.kim("init", args.kim_model, "metal", "unit_conversion_mode")

    L.read_data(args.input_data_file)

    potential(L, args)

    # Need to set mass to something, just to satisfy LAMMPS
    mass_dictionary = {
        'H': 1.00797,
        'He': 4.00260,
        'Li': 6.941,
        'Be': 9.01218,
        'B': 10.81,
        'C': 12.011,
        'N': 14.0067,
        'O': 15.9994,
        'F': 18.998403,
        'Ne': 20.179,
        'Na': 22.98977,
        'Mg': 24.305,
        'Al': 26.98154,
        'Si': 28.0855,
        'P': 30.97376,
        'S': 32.06,
        'Cl': 35.453,
        'K': 39.0983,
        'Ar': 39.948,
        'Ca': 40.08,
        'Sc': 44.9559,
        'Ti': 47.90,
        'V': 50.9415,
        'Cr': 51.996,
        'Mn': 54.9380,
        'Fe': 55.847,
        'Ni': 58.70,
        'Co': 58.9332,
        'Cu': 63.546,
        'Zn': 65.38,
        'Ga': 69.72,
        'Ge': 72.59,
        'As': 74.9216,
        'Se': 78.96,
        'Br': 79.904,
        'Kr': 83.80,
        'Rb': 85.4678,
        'Sr': 87.62,
        'Y': 88.9059,
        'Zr': 91.22,
        'Nb': 92.9064,
        'Mo': 95.94,
        'Tc': 98,
        'Ru': 101.07,
        'Rh': 102.9055,
        'Pd': 106.4,
        'Ag': 107.868,
        'Cd': 112.41,
        'In': 114.82,
        'Sn': 118.69,
        'Sb': 121.75,
        'I': 126.9045,
        'Te': 127.60,
        'Xe': 131.30,
        'Cs': 132.9054,
        'Ba': 137.33,
        'La': 138.9055,
        'Ce': 140.12,
        'Pr': 140.9077,
        'Nd': 144.24,
        'Pm': 145,
        'Sm': 150.4,
        'Eu': 151.96,
        'Gd': 157.25,
        'Tb': 158.9254,
        'Dy': 162.50,
        'Ho': 164.9304,
        'Er': 167.26,
        'Tm': 168.9342,
        'Yb': 173.04,
        'Lu': 174.967,
        'Hf': 178.49,
        'Ta': 180.9479,
        'W': 183.85,
        'Re': 186.207,
        'Os': 190.2,
        'Ir': 192.22,
        'Pt': 195.09,
        'Au': 196.9665,
        'Hg': 200.59,
        'Tl': 204.37,
        'Pb': 207.2,
        'Bi': 208.9804,
        'Po': 209,
        'At': 210,
        'Rn': 222,
        'Fr': 223,
        'Ra': 226.0254,
        'Ac': 227.0278,
        'Pa': 231.0359,
        'Th': 232.0381,
        'Np': 237.0482,
        'U': 238.029
    }
    for itype in range(1, len(args.elements) + 1):
        L.mass(itype, mass_dictionary.get(args.elements[itype - 1], 1.0e-20))

    # Compute initial state at zero pressure
    L.fix(3, "all", "box/relax", "aniso", 0.0)
    L.min_style(args.min_style)
    L.minimize(args.minimize[0], args.minimize[1], int(args.minimize[2]),
               int(args.minimize[3]))

    L.variable("lx0 equal {}".format(L.eval("lx")))
    L.variable("ly0 equal {}".format(L.eval("ly")))
    L.variable("lz0 equal {}".format(L.eval("lz")))

    # These formulas define the derivatives w.r.t. strain components
    L.variable("d1 equal -(v_pxx1-{})/(v_delta/v_len0)*{}".format(
        L.eval("pxx"), cfac))
    L.variable("d2 equal -(v_pyy1-{})/(v_delta/v_len0)*{}".format(
        L.eval("pyy"), cfac))
    L.variable("d3 equal -(v_pzz1-{})/(v_delta/v_len0)*{}".format(
        L.eval("pzz"), cfac))
    L.variable("d4 equal -(v_pyz1-{})/(v_delta/v_len0)*{}".format(
        L.eval("pyz"), cfac))
    L.variable("d5 equal -(v_pxz1-{})/(v_delta/v_len0)*{}".format(
        L.eval("pxz"), cfac))
    L.variable("d6 equal -(v_pxy1-{})/(v_delta/v_len0)*{}".format(
        L.eval("pxy"), cfac))

    L.displace_atoms("all", "random", atomjiggle, atomjiggle, atomjiggle,
                     87287, "units box")

    # Write restart
    L.unfix(3)
    L.write_restart("restart.equil")

    for idir in range(1, 7):
        displace(L, args, idir)

    postprocess_and_output(L)
    return
Exemplo n.º 3
0
    def test_use_data_file(self):
        L = PyLammps()
        L.units('real') # angstrom, kcal/mol, femtoseconds
        L.atom_style('atomic')
        L.boundary('p p p')

        L.lattice('none', 1.0)

        # create simulation cell
        L.region('r1 block', -15.0, 15.0, -15.0, 15.0, -15.0, 15.0)
        L.create_box(1, 'r1')

        # argon
        L.mass(1, 39.948002)
        L.pair_style('lj/cut', 8.5)
        L.pair_coeff(1, 1, 0.2379, 3.405)

        L.timestep(10.0)

        L.create_atoms(1, 'single', -1.0, 0.0, 0.0)
        L.create_atoms(1, 'single',  1.0, 0.0, 0.0)

        L.velocity('all create', 250.0, 54321, 'mom no rot no')

        L.minimize(1.0e-10, 1.0e-10, 100, 1000)

        L.reset_timestep(0)

        L.thermo(100)
        L.fix('f1 all nve')
        L.run(1000)

        L.write_restart('run.restart')
        L.write_data('run.data')

        L2 = PyLammps()
        L2.units('real')           # angstrom, kcal/mol, femtoseconds
        L2.atom_style('atomic')
        L2.boundary('p p p')

        L2.pair_style('lj/cut', 8.5)
        L2.read_data('run.data')

        L2.timestep(10.0)

        L2.thermo(100)
        L2.fix('f1 all nve')
        L2.run(1000)

        # reset status. forget all settings. delete system
        L2.clear()

        L2.read_restart('run.restart')

        L2.thermo(100)
        L2.fix('f1 all nve')
        L2.run(1000)

        os.remove('run.restart')
        os.remove('run.data')

        self.assertEqual(L.system, L2.system)
    L.fix("nveintegration", "clustergr",
          "nve")  # move only cluster atoms and surface substrate atoms

    starttime = time.time()
    L.run(20000)
    print("dt at start: {} fs".format(L.eval("dt") * 1000))
    print("T at start: {} K".format(L.eval("temp")))
    print("elapsed time: {} s".format(time.time() - starttime))
    L.unfix("thermofix2")

    #initial equilibration procedure finished:
    print("****************************************")
    print("initial equilibration procedure finished, writing restart file")
    print("****************************************")

    L.write_restart("restart.equil")
else:
    L.read_restart("restart.equil")

L.velocity("all", "create", Temp, 12345, "dist", "gaussian", "mom", "yes",
           "rot", "yes")
#L.fix("mainvartimestep","clustergr","dt/reset",10,"NULL","NULL",latticeconst/30,"emax",0.1,"units","box")
L.fix("mainvartimestep", "clustergr", "dt/reset", 1, "NULL", "NULL", 0.1,
      "units", "box")
L.fix("linmomfix", "clustergr", "momentum", 1, "linear", 1, 1,
      1)  # remove linear momentum for better displacement detection

#L.fix("thermofix3","clustergr","langevin",Temp,Temp,0.05, 2614,"zero","yes")
#L.fix("thermofix3","clustergr","temp/csvr",Temp,Temp,0.1,12345)

nodispl = 0