#! /usr/bin/env python import friction_tools as ft # create the simulation containing two atoms simu = ft.FrictionSimulation() simu.create_atoms(element='C', positions=[[0, 0, 0], [6, 0, 0]]) # create an interaction between the two atoms simu.create_interaction(['C', 'C'], strength=10.0, equilibrium_distance=5.0) # give the atoms some initial velocities vs = [[0.1, 0, 0], [-0.1, 0, 0]] simu.set_velocities(indices=range(2), velocity=vs) # tell that we want to run the simulation with default settings simu.create_dynamics() # tell that we want to record the movement of the atoms simu.save_trajectory_during_simulation(interval=5) # run the simulation for 1000 fs print "starting simulation" simu.run_simulation(time=1000.0) print "finished simulation" # after finishing, create an xyz-file for viewing what happened ft.trajectory_to_xyz()
def main(fixed_strength): def create_lj_interactions(strengths): """ Creates Lernnard-Jones potential interactions between materials. @param strengths: {'material': 1.0} - dict of material-strength pairs. """ sim.create_interaction( [fixed_slab_material, fixed_slab_material], strengths.get(fixed_slab_material, 0.0), 10 / (fixed_slab_xy * (2 ** 0.5)) ) sim.create_interaction( [moving_slab_material, moving_slab_material], strengths.get(moving_slab_material, 0.0), 10 / (moving_slab_xy * (2 ** 0.5)) ) sim.create_interaction( [fixed_slab_material, moving_slab_material], 1.0, 2.0 ) def create_coulomb_interactions(charges): """ Creates Coulombs summation interactions between materials. @param charges: {'material': 1.0} - dict of material-charge pairs. """ def charge_by_elements(element): """ Maps elements with their according charges. """ return charges.get(element, 0.0) # Set charges sim.system.set_charges( map(charge_by_elements, sim.system.get_chemical_symbols()) ) # Create instance of the CoulombSummation class coulomb_sum = pysic.CoulombSummation() # Find good enough computational parameters parameters = pysic.interactions.coulomb.estimate_ewald_parameters() # Set the parameters to the summation object coulomb_sum.set_parameter_values(list(parameters)) # Add the created CoulombSummation object to the Pysic calculator objec sim.calc.set_coulomb_summation(coulomb_sum) def friction_initial_velocity_x(threshold_x, initial_velocity_x=0.1): """ Measures friction by giving the moving slab an initial velocity in x-direction and simulating until the slab has stopped moving. @param threshold_x: 1.0 - values below threshold count as being stopped """ # Set initial velocity in x-direction sim.set_velocities( indices=moving_mat_indices, velocity=[initial_velocity_x, 0, 0] ) print('Slab is now moving. Simming until it stops...') while sim.get_avg_velocity(moving_mat_indices)[0] > threshold_x: print('Velocities are now: '+str( sim.get_avg_velocity(moving_mat_indices) )) sim.run_simulation(300) print('Velocities are now: '+str( sim.get_avg_velocity(moving_mat_indices) )) def friction_constant_velocity_x(indices, constant_velocity_x): sim.fix_velocities( indices=indices, velocity=[constant_velocity_x, 0, 0] ) print('Slab is now moving in constant velocity...') sim.run_simulation(1000) moving_slab_material = 'Ag' moving_slab_xy = 3 # 3 moving_slab_z = 2 # 2 fixed_slab_material = 'Au' fixed_slab_xy = 5 # 5 # fixed_slab_z = 2 # 2 element_lj_strengths = { 'Au': fixed_strength, 'Ag': 1.0 } # Create simulation object sim = ft.FrictionSimulation() # Calculate thresholds for being in touch with the surface contact_threshold = math.ceil(10.0 / float(moving_slab_xy)) * moving_slab_z # velocity_threshold_x = 0.04 # Create the two slabs and store their indices # TODO: Edit to use z-config sim.create_slab( element=fixed_slab_material, xy_cells=fixed_slab_xy, z_cells=2, top_z=0.0 ) sim.create_slab( element=moving_slab_material, xy_cells=moving_slab_xy, z_cells=2, bottom_z=5.0 ) # fixed_mat_indices = sim.get_indices_by_element(fixed_slab_material) moving_mat_indices = sim.get_indices_by_element(moving_slab_material) # TODO: Edit to use z-config # Bottom row of fixed materials atoms bottom_indices = sim.get_indices_z_less_than(-2) # Top row of moving materials atoms top_indices = sim.get_indices_z_more_than(8.0) # Create interactions create_lj_interactions(element_lj_strengths) # create_coulomb_interactions(element_charges) # Currently too slow! # Create dynamics and configure the setup sim.create_dynamics(dt=1.0, temperature=300) # Fix the bottom slab and make the top slab move down sim.fix_positions(bottom_indices) sim.add_constant_force(top_indices, [0, 0, -0.1]) # sim.fix_velocities(top_indices, [0, 0, -0.005], [True, True, True]) sim.set_temperature(300) # Try to reset the temperature # Save tmps, print stats and time the simulation # sim.save_trajectory_during_simulation(interval=50.0) # sim.print_stats_during_simulation(interval=50.0) # t0 = time.time() print('Starting the simulation') print(sim.get_avg_forces(moving_mat_indices)) while len(sim.get_indices_z_more_than(contact_threshold)): print(len(sim.get_indices_z_more_than(contact_threshold))) print(sim.get_avg_velocity(moving_mat_indices)) print(sim.get_avg_forces(moving_mat_indices)) sim.run_simulation(300) print('Moving slab hit the fixed slab.') sim.remove_constraints() print('Starting friction measurement phase.') xpos0 = [p[0] for p in sim.get_positions(indices=moving_mat_indices)] friction_initial_velocity_x(0.005, 0.1) xpos1 = [p[0] for p in sim.get_positions(indices=moving_mat_indices)] xdiff = [] for i in range(0, len(xpos0)): xdiff.append(xpos1[i] - xpos0[i]) xdiffavg = sum(xdiff) / len(xdiff) out = open('dataout_fixed_slab.txt', 'a') out.write('\n{0} {1} {2}'.format(fixed_strength, numpy.mean(xdiff), numpy.var(xdiff))) out.close() #out2 = open('dataout_{0}.txt'.format(fixed_strength), 'a') #for i in range(0, len(xdiff)): # out2.write('\n{0}'.format(xdiff[i])) #out2.close() print(xpos0, xpos1) print('All done, generating simulation file.')
def init_simulation(simulation_time=1000, element_surf='Au', dims_surf=(20, 8, 5), element_obj='C', dims_obj=(3, 3, 3), set_force=[0.0, 0.0, -0.02], set_interval=10, root_path='/u/76/tolland1/unix/Desktop/', set_folder_name='initialise_number'): """ Initialises a surface without periodic boundary conditions and a brick on top of the surface: :param simulation_time: Simulation time :param element_surf: Chemical symbol for the surface element. :param dims_surf: Dimensions in (x, y, z) format :param element_obj: Chemical symbol for the object element. :param dims_obj: Dimensions in (x, y, z) format :param set_force: Force acting on the object. :param set_interval: Interval for gathering data. (How often the gathered data is saved.) :param root_path: Root path for saving data. :param set_folder_name: The folder where the simulations is initialised. If already exists, existing one is overwritten :return: Trajectory of the initialised simulation saved in the folder defined. """ # Lennard-Jones constants lennardjones_surf = [1.0, 1.414] lennardjones_obj = [1.0, 1.414] lennardjones_surfojb = [0.1, 1.414] ''' Define the initialise folder and save it to initialise.pkl Save simulation details and sate to file ''' folder_path = root_path + set_folder_name + '/' et.init_dir(path=folder_path) output = open('initialise.pkl', 'wb') pickle.dump(obj=folder_path, file=output) output.close() configs = [element_surf, dims_surf, element_obj, dims_obj, set_force, lennardjones_surf, lennardjones_obj, lennardjones_surfojb] output = open(folder_path + 'simulation_config.pkl', 'wb') pickle.dump(obj=configs, file=output) output.close() date_and_time = datetime.datetime.today() get_date = date_and_time.strftime('%d.%m.%Y') get_time = date_and_time.strftime('%H:%M:%S') output = open(folder_path + 'info.txt', 'w') info = 'Date: {0}\nTime: {1}\nSimulation time: {2}\nSurface: {3} {4}\nObject: {5} {6}\nForce: {7}' output.write(info.format(get_date, get_time, simulation_time, element_surf, dims_surf, element_obj, dims_obj, set_force)) output.close() ''' Simulation ''' simulation = ft.FrictionSimulation() ''' Non-periodic Surface. Bottom of the surface is fixed in its initial position. ''' positions_surf = et.brick(x_width=dims_surf[0], y_width=dims_surf[1], z_width=dims_surf[2], x_pos=0, y_pos=0, z_pos=-2 * dims_surf[2]) simulation.create_atoms(element=element_surf, positions=positions_surf) # Fix positions of the bottom bottom_indices = simulation.get_indices_z_less_than(z_limit=-2 * dims_surf[2] + 0.5) simulation.fix_positions(indices=bottom_indices, xyz=[True, True, True]) # For restricting thermostat indices_surf_unfixed = simulation.get_indices_z_more_than(z_limit=-2 * dims_surf[2]) ''' Object. ''' positions_obj = et.brick(x_width=dims_obj[0], y_width=dims_obj[1], z_width=dims_obj[2], x_pos=2, y_pos=dims_surf[1] - dims_obj[1], z_pos=2) simulation.create_atoms(element=element_obj, positions=positions_obj) indices_obj = simulation.get_indices_by_element(element=element_obj) # Force if set_force is None: print 'Force is not set.\nRemember to add a force when running the actual simulation' else: simulation.add_constant_force(indices=indices_obj, force=set_force) # Interacting lennard-jones forces between the particles. simulation.create_interaction([element_surf, element_surf], strength=lennardjones_surf[0], equilibrium_distance=lennardjones_surf[1]) simulation.create_interaction([element_obj, element_obj], strength=lennardjones_obj[0], equilibrium_distance=lennardjones_obj[1]) simulation.create_interaction([element_surf, element_obj], strength=lennardjones_surfojb[0], equilibrium_distance=lennardjones_surfojb[1]) simulation.list_atoms() simulation.create_dynamics(dt=1.0, temperature=300, coupled_indices=indices_surf_unfixed, strength=0.01) # Trajectory simulation.save_trajectory_during_simulation(interval=set_interval, filename=folder_path + 'simulation.traj') simulation.print_stats_during_simulation(interval=5.0) # Time the simulation t0 = time.time() simulation.run_simulation(time=simulation_time) t1 = time.time() runtime = "{ti} s".format(ti=str(int(t1 - t0))) output = open(folder_path + 'info.txt', 'a') output.write('\nRuntime: {0}'.format(runtime)) output.close() print 'Time taken {0}'.format(runtime) # Convert .traj to .xyz ft.trajectory_to_xyz(filename_in=folder_path + 'simulation.traj', filename_out=folder_path + 'simulation.xyz')
def main(strengths): moving_slab_material = 'Ag' moving_slab_xy = 3 # 3 moving_slab_z = 2 # 2 fixed_slab_material = 'Au' fixed_slab_xy = 5 # 5 fixed_slab_z = 2 # 2 element_charges = {'Au': 0.01, 'Ag': 0.005} element_lj_strengths = strengths """= { 'Au': 1.0, 'Ag': 0.5 }""" # Create simulation object sim = ft.FrictionSimulation() # Calculate thresholds for being in touch with the surface contact_threshold = math.ceil(10.0 / float(moving_slab_xy)) * moving_slab_z velocity_threshold_x = 0.04 # Create the two slabs and store their indices # TODO: Edit to use z-config sim.create_slab(element=fixed_slab_material, xy_cells=fixed_slab_xy, z_cells=2, top_z=0.0) sim.create_slab(element=moving_slab_material, xy_cells=moving_slab_xy, z_cells=2, bottom_z=5.0) fixed_mat_indices = sim.get_indices_by_element(fixed_slab_material) moving_mat_indices = sim.get_indices_by_element(moving_slab_material) # TODO: Edit to use z-config bottom_indices = sim.get_indices_z_less_than( -2) # Bottom row of fixed materials atoms top_indices = sim.get_indices_z_more_than( 8.0) # Top row of moving materials atoms # Create interactions create_lj_interactions(element_lj_strengths) # create_coulomb_interactions(element_charges) # Currently too slow! # Create dynamics and configure the setup sim.create_dynamics(dt=1.0, temperature=300) # Fix the bottom slab and make the top slab move down sim.fix_positions(bottom_indices) sim.add_constant_force(top_indices, [0, 0, -0.1]) # sim.fix_velocities(top_indices, [0, 0, -0.005], [True, True, True]) sim.set_temperature(300) # Try to reset the temperature # Save tmps, print stats and time the simulation sim.save_trajectory_during_simulation(interval=50.0) sim.print_stats_during_simulation(interval=50.0) t0 = time.time() print('Starting the simulation') print(sim.get_avg_forces(moving_mat_indices)) while len(sim.get_indices_z_more_than(contact_threshold)): print(len(sim.get_indices_z_more_than(contact_threshold))) print(sim.get_avg_velocity(moving_mat_indices)) print(sim.get_avg_forces(moving_mat_indices)) sim.run_simulation(500) print('Moving slab hit the fixed slab.') sim.remove_constraints() print('Starting friction measurement phase.') xpos0 = [p[0] for p in sim.get_positions(indices=moving_mat_indices)] friction_initial_velocity_x(0.005, 0.1) xpos1 = [p[0] for p in sim.get_positions(indices=moving_mat_indices)] xdiff = [] for i in range(0, len(xpos0)): xdiff.append(xpos1[i] - xpos0[i]) out = open('ownpos.txt', 'w') for i in range(0, len(xpos0)): out.write('{0}\n'.format(xpos0[i], xpos1[i])) out.close() print('All done, generating simulation file.') print(sim.get_avg_forces(moving_mat_indices)) sim.write_positions_to_file(indices=moving_mat_indices) sim.write_average_position_to_file(indices=moving_mat_indices) sim.write_velocities_to_file(indices=moving_mat_indices) ft.trajectory_to_xyz() #===================== #>>>>> MAIN 2 <<<<<<<< #===================== #sim = ft.FrictionSimulation() ## Calculate thresholds for being in touch with the surface #contact_threshold = math.ceil(10.0 / float(moving_slab_xy)) * moving_slab_z #velocity_threshold_x = 0.04 ## Create the two slabs and store their indices ## TODO: Edit to use z-config #sim.create_slab(element=fixed_slab_material, xy_cells=fixed_slab_xy, z_cells=2, top_z=0.0) #sim.create_slab(element=moving_slab_material, xy_cells=moving_slab_xy, z_cells=2, bottom_z=5.0) #fixed_mat_indices = sim.get_indices_by_element(fixed_slab_material) #moving_mat_indices = sim.get_indices_by_element(moving_slab_material) ## TODO: Edit to use z-config #bottom_indices = sim.get_indices_z_less_than(-2) # Bottom row of fixed materials atoms #top_indices = sim.get_indices_z_more_than(8.0) # Top row of moving materials atoms ## Create interactions #create_lj_interactions(element_lj_strengths) #create_coulomb_interactions(element_charges) # Currently too slow! ## Create dynamics and configure the setup #sim.create_dynamics(dt=1.0, temperature=300) ## Fix the bottom slab and make the top slab move down #sim.fix_positions(bottom_indices) #sim.add_constant_force(top_indices, [0, 0, -0.1]) ## sim.fix_velocities(top_indices, [0, 0, -0.005], [True, True, True]) #sim.set_temperature(300) # Try to reset the temperature ## Save tmps, print stats and time the simulation #sim.save_trajectory_during_simulation(interval=50.0) #sim.print_stats_during_simulation(interval=50.0) #t0 = time.time() #print('Starting the simulation') #while len(sim.get_indices_z_more_than(contact_threshold)): #print(len(sim.get_indices_z_more_than(contact_threshold))) #print(sim.get_avg_velocity(moving_mat_indices)) #sim.run_simulation(500) #print('Moving slab hit the fixed slab.') #print('Starting friction measurement phase.') #friction_constant_velocity_x([initial_velocity, 0.0, 0.0]) #print('All done, generating simulation file.') #ft.trajectory_to_xyz()
def read_and_run_simulation(simulation_time=1000, set_velocity=[0.50, 0.0, 0.0], set_force=None, set_interval=1, root_path='/u/76/tolland1/unix/Desktop/', set_folder_name='simulation_number'): """ Run a simulation from initialised trajectory. :param simulation_time: Simulation time :param set_velocity: The velocity given to object. :param set_force: The force acting on the object. Default is None, which loads the force used in the initialising. If value is given it will be used instead of the force in the initialisement. :param set_interval: Interval for gathering data. (How often the gathered data is saved.) :param root_path: Root path for saving data. :param set_folder_name: The folder where the simulations is saved. If already exists, existing one is overwritten :return: Trajectory of the simulation saved in the folder defined. """ # Initialise folder to root path folder_path = root_path + set_folder_name + '/' et.init_dir(path=folder_path) # load initialised simulation infile = open('initialise.pkl', 'rb') folder_load = pickle.load(file=infile) infile.close() infile = open(folder_load + 'simulation_config.pkl', 'rb') configs = pickle.load(file=infile) infile.close() [ element_surf, dims_surf, element_obj, dims_obj, get_force, lennardjones_surf, lennardjones_obj, lennardjones_surfojb ] = configs if set_force is None: set_force = get_force date_and_time = datetime.datetime.today() get_date = date_and_time.strftime('%d.%m.%Y') get_time = date_and_time.strftime('%H:%M:%S') output = open(folder_path + 'info.txt', 'w') info = 'Date: {0}\nTime: {1}\nSimulation time: {2}\nSurface: {3} {4}\nObject: {5} {6}\nForce: {7}\nVelocity: {8}' output.write( info.format(get_date, get_time, simulation_time, element_surf, dims_surf, element_obj, dims_obj, set_force, set_velocity)) output.close() ''' Simulation ''' simulation = ft.FrictionSimulation() simulation.continue_from_trajectory(filename=folder_load + 'simulation.traj') # Fix positions of the bottom slab bottom_indices = simulation.get_indices_z_less_than( z_limit=-2 * dims_surf[2] + 0.1) simulation.fix_positions(indices=bottom_indices, xyz=[True, True, True]) # For restricting thermostat indices_surf_unfixed = simulation.get_indices_z_more_than(z_limit=-2 * dims_surf[2]) # Velocities indices_obj = simulation.get_indices_by_element(element=element_obj) velocities_obj = np.ones([len(indices_obj), 3], dtype='float') velocities_obj = velocities_obj * np.array(set_velocity) simulation.set_velocities(indices=indices_obj, velocity=velocities_obj) # Force if set_force is None: print 'Force is not set.' else: simulation.add_constant_force(indices=indices_obj, force=set_force) # Interacting lennard-jones forces between the particles. simulation.create_interaction([element_surf, element_surf], strength=lennardjones_surf[0], equilibrium_distance=lennardjones_surf[1]) simulation.create_interaction([element_obj, element_obj], strength=lennardjones_obj[0], equilibrium_distance=lennardjones_obj[1]) simulation.create_interaction([element_surf, element_obj], strength=lennardjones_surfojb[0], equilibrium_distance=lennardjones_surfojb[1]) # simulation.list_atoms() # simulation.create_dynamics(dt=1.0, temperature=300, coupled_indices=indices_surf_unfixed, strength=0.01) # Trajectory simulation.save_trajectory_during_simulation(interval=set_interval, filename=folder_path + 'simulation.traj') # Energy and Temperature simulation.gather_energy_and_temperature_during_simulation( interval=set_interval, filename=folder_path + 'energy.txt') # Work simulation.gather_total_work_during_simulation( interval=set_interval, indices=indices_surf_unfixed, filename=folder_path + 'work_tot_surf.txt') simulation.gather_total_work_during_simulation(interval=set_interval, indices=indices_obj, filename=folder_path + 'work_tot_obj.txt') # Average positions simulation.gather_average_position_during_simulation( interval=set_interval, filename=folder_path + 'avr_positions_surf.txt', indices=indices_surf_unfixed) simulation.gather_average_position_during_simulation( interval=set_interval, filename=folder_path + 'avr_positions_obj.txt', indices=indices_obj) # Velocities simulation.gather_velocities_during_simulation( interval=simulation_time, filename=folder_path + 'velocities_surf.txt', indices=indices_surf_unfixed) simulation.gather_velocities_during_simulation(interval=simulation_time, filename=folder_path + 'velocities_obj.txt', indices=indices_obj) # Print Stats during simulation simulation.print_stats_during_simulation(interval=5.0) # Time the simulation t0 = time.time() simulation.run_simulation(time=simulation_time) t1 = time.time() runtime = "{ti} s".format(ti=str(int(t1 - t0))) output = open(folder_path + 'info.txt', 'a') output.write('\nRuntime: {0}'.format(runtime)) output.close() print 'Time taken {0}'.format(runtime) # Convert .traj to .xyz ft.trajectory_to_xyz(filename_in=folder_path + 'simulation.traj', filename_out=folder_path + 'simulation.xyz')