Exemplo n.º 1
0
def test_4atoms():
    a = Atom("Ar", [0.5, 0.5, 0])
    b = Atom("Ar", [0.5, -0.5, 0])
    c = Atom("Ar", [-0.2, -0.5, 0])
    d = Atom("Ar", [-0.5, 0.5, 0.5])
    sys = MonatomicSystem([a, b, c, d], 6.0)

    v = Viewer()
    sr = v.add_renderer(SphereRenderer, sys.atoms)
    v.add_renderer(CubeRenderer, sys.boxsize)

    # evo takes times in picoseconds
    evo = evolve_generator(sys, t=1e3, tstep=0.002, periodic=True)

    def update_pos():
        try:
            for i in range(100):
                sys, t = evo.next()
            sr.update(sys.r_array)

        except StopIteration:
            pass
            #import pylab as pl
            #pl.plot(distances, pitentials, 'o')
            #pl.show()

    v.schedule(update_pos)
    v.run()
Exemplo n.º 2
0
def test_3():
    '''Make this much more interactive'''
    from chemlab.graphics.processviewer import ProcessViewer
    boxsize = 30.0
    nmol = 1000
    sys = MonatomicSystem.random("Ar", nmol, boxsize)
    v = ProcessViewer()
    pr = v.add_renderer(SphereRenderer, sys.atoms)
    v.add_renderer(CubeRenderer, boxsize)
    
    for i in range(100):
        # Let's try to make periodic boundary conditions
        farray = forces.lennard_jones(sys.r_array, "Ar", periodic=boxsize)
        # Just this time let's assume masses are 1
        sys.r_array, sys.varray = integrators.euler(sys.r_array, sys.varray, farray/30.17, 0.01)
        
        # Add more periodic conditions
        rarray = sys.r_array
        
        i_toopositive = rarray > boxsize * 0.5
        rarray[i_toopositive] -= boxsize  
        i_toonegative = rarray < - boxsize * 0.5
        rarray[i_toonegative] += boxsize
        
        sys.r_array = rarray
        pr.update(rarray)
    
    v._p.join()
Exemplo n.º 3
0
def test_periodic():
    '''Now let's try to implement the periodic boundaries, we should
    try to put the molecules near the border and see if one molecule
    'passes' the wall.

    '''
    import pyglet
    pyglet.options['vsync'] = False

    # Let's say we have to store this in nm and picoseconds
    # I setup argon atoms pretty overlapping
    a = Atom("Ar", [0.5, 0.0, 0.0])
    b = Atom("Ar", [-1.4, 0.0, 0.0])
    sys = MonatomicSystem([a, b], 3.0)

    v = Viewer()

    sr = v.add_renderer(SphereRenderer, sys.atoms)
    v.add_renderer(CubeRenderer, sys.boxsize)

    # evo takes times in picoseconds
    evo = evolve_generator(sys, t=1e3, tstep=0.002, periodic=True)

    distances = [np.linalg.norm(sys.r_array[0] - sys.r_array[1])]
    pitentials = [
        cenergy.lennard_jones(sys.r_array * 1e-9, 'Ar', periodic=False)
    ]

    def update_pos():
        try:
            for i in range(100):
                sys, t = evo.next()

            dist = np.linalg.norm(sys.r_array[0] - sys.r_array[1])
            pot = cenergy.lennard_jones(sys.r_array * 1e-9,
                                        'Ar',
                                        periodic=False)
            distances.append(dist)
            pitentials.append(pot)
            sr.update(sys.r_array)

        except StopIteration:
            pass
            #import pylab as pl
            #pl.plot(distances, pitentials, 'o')
            #pl.show()

    v.schedule(update_pos)
    v.run()
Exemplo n.º 4
0
def test_forces():
    '''This test simply shows two atoms that are subject to a lennard
    jones potential. you can modulate the distance between atoms and
    see if this physically makes sense. For example two atoms at a
    distance of about 1.5sigma should bounce.

    '''
    import pyglet
    pyglet.options['vsync'] = False

    # Let's say we have to store this in nm and picoseconds
    # I setup argon atoms pretty overlapping
    a = Atom("Ar", [0.0, 0.0, 0.0])
    b = Atom("Ar", [1.00, 0.0, 0.0])
    sys = MonatomicSystem([a, b], 3.0)

    v = Viewer()

    sr = v.add_renderer(SphereRenderer, sys.atoms)
    v.add_renderer(CubeRenderer, sys.boxsize)

    # evo takes times in picoseconds
    evo = evolve_generator(sys, t=1e2, tstep=0.002, periodic=False)
    distances = [np.linalg.norm(sys.r_array[0] - sys.r_array[1])]
    pitentials = [
        cenergy.lennard_jones(sys.r_array * 1e-9, 'Ar', periodic=False)
    ]

    def update_pos():
        try:
            for i in range(100):
                sys, t = evo.next()

            dist = np.linalg.norm(sys.r_array[0] - sys.r_array[1])
            pot = cenergy.lennard_jones(sys.r_array * 1e-9,
                                        'Ar',
                                        periodic=False)
            distances.append(dist)
            pitentials.append(pot)
            sr.update(sys.r_array)

        except StopIteration:
            import pylab as pl
            pl.plot(distances, pitentials, 'o')
            pl.show()

    v.schedule(update_pos)
    v.run()
Exemplo n.º 5
0
def test_1():
    boxsize = 50.0
    sys = MonatomicSystem.random("Ne",500, boxsize)
    #x, y = pair_correlation(sys, 20)
    #pl.plot(x, y)
    for i in range(1000):
        print "Step ", i
        farray = forces.lennard_jones(sys.r_array, "Ne", periodic=boxsize)
        # Just this time let's assume masses are 1
        sys.r_array, sys.varray = integrators.euler(sys.r_array, sys.varray, farray/300.17, 0.011)
        
        # Add more periodic conditions
        rarray = sys.r_array
        
        i_toopositive = rarray > boxsize * 0.5
        rarray[i_toopositive] -= boxsize  
        i_toonegative = rarray < - boxsize * 0.5
        rarray[i_toonegative] += boxsize
        
        sys.r_array = rarray
Exemplo n.º 6
0
def test_2():
    boxsize = 15.0 #nm
    nmol = 400
    sys = MonatomicSystem.random("Ar", nmol, boxsize)
    
    v = Viewer()
    pr = v.add_renderer(SphereRenderer, sys.atoms)
    v.add_renderer(CubeRenderer, boxsize)
    
    sys.varray = (np.random.rand(nmol, 3).astype(np.float32) - 0.5)
    
    gen = evolve_generator(sys, t=1000, tstep=0.002, periodic=True)
    
    def iterate(dt):
        for i in range(10):
            sys, t = gen.next()
        pr.update(sys.r_array)
    
    import pyglet
    pyglet.clock.schedule(iterate)
    pyglet.app.run()