Пример #1
0
def run_nve(_nnucl, _ntraj, _q, _p, iM, model, params):
    """
    model - setup the Hamiltonian
    outname - the name of the output file
    """

    ndia, nadi, nnucl, ntraj = 1, 1, _nnucl, _ntraj
    q = MATRIX(_q)
    p = MATRIX(_p)

    # ======= Hierarchy of Hamiltonians =======
    ham = nHamiltonian(ndia, nadi, nnucl)
    ham.init_all(2)

    ham1 = []
    for tr in xrange(ntraj):
        ham1.append(nHamiltonian(ndia, nadi, nnucl))
        ham1[tr].init_all(2)
        ham.add_child(ham1[tr])

    #  Set up the models and compute internal variables
    # Initial calculations
    ham.compute_diabatic(compute_model, q, params, 1)
    ham.compute_adiabatic(1, 1)

    Ekin, Epot, Etot = compute_etot(ham, p, iM)

    out1 = open(params["out_energy"], "w")
    out1.close()
    out2 = open(params["out_phase_space"], "w")
    out2.close()
    out3 = open(params["out_positions"], "w")
    out3.close()

    dt = params["dt"]

    Q, P = [], []
    Q.append(MATRIX(q))
    P.append(MATRIX(p))

    f = open(params["trajectory_filename"], "w")
    f.close()

    for i in xrange(params["nsteps"]):

        print_xyz(params["label"], q, params["trajectory_index"],
                  params["trajectory_filename"], i)
        Verlet1(dt, q, p, iM, ham, compute_model, params, 0)

        #        sys.exit(0)
        """
        if params["is_periodic"] == 1:
            for dof in xrange(nnucl):
                print dof
                for tr in xrange(ntraj):     
                    if(q.get(dof, tr) > TV):
                        pass #q.add(dof, tr, -1.0*TV)
                    elif(q.get(dof, tr) < 0.0):
                        pass #q.add(dof, tr, TV)
        sys.exit(0)
        """

        Q.append(MATRIX(q))
        P.append(MATRIX(p))

        #=========== Properties ==========

        Ekin, Epot, Etot = compute_etot(ham, p, iM)

        Tcurr = 2.0 * Ekin / (nnucl * kb)

        # Print the ensemble average - kinetic, potential, and total energies
        # Print the tunneling information. Here, we count each trajectory across the barrier.
        out1 = open(params["out_energy"], "a")
        out1.write(" %8.5f  %8.5f  %8.5f  %8.5f  %8.5f\n" %
                   (i * dt, Ekin, Epot, Etot, Tcurr))
        out1.close()

        # Print the phase space information
        out2 = open(params["out_phase_space"], "a")
        for j in range(ntraj):
            out2.write(" %8.5f  %8.5f" % (q.get(0, j), p.get(0, j))),
        out2.write("\n")
        out2.close()

        # Print the position versus time infromation
        out3 = open(params["out_positions"], "a")
        out3.write(" %8.5f" % (i * dt)),
        for j in range(ntraj):
            out3.write(" %8.5f" % (q.get(0, j)))
        out3.write("\n")
        out3.close()

    return Q, P
Пример #2
0
def run_nvt(_nnucl, _ntraj, _q, _p, iM, model, params):
    """
    model - setup the Hamiltonian
    outname - the name of the output file
    """

    Q, P = [], []

    ndia, nadi, nnucl, ntraj = 1, 1, _nnucl, _ntraj
    q = MATRIX(_q)
    p = MATRIX(_p)

    # ======= Hierarchy of Hamiltonians =======
    ham = nHamiltonian(ndia, nadi, nnucl)
    ham.init_all(2)

    ham1 = []
    for tr in xrange(ntraj):
        ham1.append(nHamiltonian(ndia, nadi, nnucl))
        ham1[tr].init_all(2)
        ham.add_child(ham1[tr])

    #  Set up the models and compute internal variables

    # Initial calculations
    ham.compute_diabatic(compute_model, q, params, 1)
    ham.compute_adiabatic(1, 1)

    therms = Thermostat(params)
    therms.set_Nf_t(nnucl * ntraj)
    therms.set_Nf_r(0)
    therms.set_Nf_b(0)
    therms.init_nhc()
    Ebath = therms.energy()

    therms.show_info()

    #    sys.exit()

    Ekin, Epot, Etot = compute_etot(ham, p, iM)

    out1 = open(params["out_energy"], "w")
    out1.close()
    out2 = open(params["out_phase_space"], "w")
    out2.close()
    out3 = open(params["out_positions"], "w")
    out3.close()

    dt = params["dt"]

    Q.append(MATRIX(q))
    P.append(MATRIX(p))

    f = open(params["trajectory_filename"], "w")
    f.close()

    # Do the propagation
    for i in xrange(params["nsteps"]):

        print_xyz(params["label"], q, params["trajectory_index"],
                  params["trajectory_filename"], i)

        Verlet1_nvt(dt, q, p, iM, ham, compute_model, params, 0, therms)

        Q.append(MATRIX(q))
        P.append(MATRIX(p))

        #=========== Properties ==========

        Ekin, Epot, Etot = compute_etot(ham, p, iM)
        Ebath = therms.energy() / float(ntraj)

        Tcurr = 2.0 * Ekin / (nnucl * kb)

        # Print the ensemble average - kinetic, potential, and total energies
        # Print the tunneling information. Here, we count each trajectory across the barrier.
        out1 = open(params["out_energy"], "a")
        out1.write(" %8.5f  %8.5f  %8.5f  %8.5f   %8.5f  %8.5f  %8.5f\n" %
                   (i * dt, Ekin, Epot, Etot, Ebath, Etot + Ebath, Tcurr))
        out1.close()

        # Print the phase space information
        out2 = open(params["out_phase_space"], "a")
        for j in range(ntraj):
            out2.write(" %8.5f  %8.5f" % (q.get(0, j), p.get(0, j))),
        out2.write("\n")
        out2.close()

        # Print the position versus time infromation
        out3 = open(params["out_positions"], "a")
        out3.write(" %8.5f" % (i * dt)),
        for j in range(ntraj):
            out3.write(" %8.5f" % (q.get(0, j)))
        out3.write("\n")
        out3.close()

    return Q, P