Exemple #1
0
def lmps_min(s, name, settings):
    """pysimm.apps.polymatic.lmps_min

    Runs LAMMPS minimization for the Polymatic algorithm.

    Args:
        s: :class:`~pysimm.system.System` to minimize
        name: name of simulation
        settings: object containing Polymatic settings

    Returns:
        result from :func:`~pysimm.lmps.minimize`
    """
    if settings.polym.min.cluster:
        nanohub = {'cores': int(settings.polym.min.nanohub_cores),
                   'walltime': int(settings.polym.min.nanohub_walltime)}
        log_name = '%s' % '_'.join(name.split())
    else:
        nanohub = {}
        log_name = 'logs/%s' % '_'.join(name.split())

    if settings.polym.min.user_input:
        sim = lmps.Simulation(s, name='initial optimization',
                 print_to_screen=False, nanohub=nanohub, custom=True)
        sim.add(settings.polym.min.min_in)
        sim.run(np=settings.np, nanohub=nanohub)
    else:
        sim = lmps.Simulation(s, name='initial optimization',
            print_to_screen=False, nanohub=nanohub,
            log=log_name
        )
        sim.add(lmps.Init(cutoff=settings.polym.min.nb_cutoff, forcefield=settings.forcefield))
        sim.add_min(
            min_style='sd',
            etol=settings.polym.min.sd_etol,
            ftol=settings.polym.min.sd_ftol,
            maxiter=settings.polym.min.sd_maxiter,
            maxeval=settings.polym.min.sd_maxeval,
        )
        sim.add_min(
            min_style='cg',
            etol=settings.polym.min.cg_etol,
            ftol=settings.polym.min.cg_ftol,
            maxiter=settings.polym.min.cg_maxiter,
            maxeval=settings.polym.min.cg_maxeval,
        )
        sim.run(np=settings.np, nanohub=nanohub)

    if settings.polym.min.cluster:
        shutil.move(log_name, 'logs')

    return True
Exemple #2
0
def lmps_cycle_npt_md(s, bonds, settings):
    """pysimm.apps.polymatic.lmps_cycle_npt_md

    Runs LAMMPS npt cycle md for the Polymatic algorithm.

    Args:
        s: :class:`~pysimm.system.System` to minimize
        bonds: number of bond to be made
        settings: object containing Polymatic settings

    Returns:
        result from lmps.md
    """
    if settings.polym.cycle_npt.cluster:
        nanohub = {'cores': int(settings.polym.cycle_npt.nanohub_cores),
                   'walltime': int(settings.polym.cycle_npt.nanohub_walltime)}
        log_name = 'cycle_npt_%03d' % bonds
    else:
        nanohub = {}
        log_name = 'logs/cycle_npt_%03d' % bonds

    if settings.polym.cycle_npt.user_input:
        sim = lmps.Simulation(s, name='bond %d cycle npt' % bonds,
                 print_to_screen=False, nanohub=nanohub, custom=True)
        sim.add(settings.polym.cycle_npt.step_in)
        sim.run(np=settings.np, nanohub=nanohub)
    else:
        sim = lmps.Simulation(s, name='bond %d cycle npt' % bonds,
            print_to_screen=False, nanohub=nanohub,
            log=log_name
        )
        sim.add(lmps.Init(cutoff=settings.polym.cycle_npt.nb_cutoff, forcefield=settings.forcefield))
        sim.add(lmps.Velocity(temperature=settings.polym.cycle_npt.temp))
        sim.add_md(
            ensemble='npt', temperature=settings.polym.cycle_npt.nb_cutoff,
            run=settings.polym.cycle_npt.length,
            pressure=settings.polym.cycle_npt.pressure,
        )
        sim.run(np=settings.np, nanohub=nanohub)

    if settings.polym.cycle_npt.cluster:
        shutil.move(log_name, 'logs')

    return True
Exemple #3
0
def lmps_step_md(s, bonds, attempt, settings):
    """pysimm.apps.polymatic.lmps_step_md

    Runs LAMMPS step md for the Polymatic algorithm.

    Args:
        s: :class:`~pysimm.system.System` to minimize
        bonds: number of bond to be made
        attempt: number of bonding attempt
        settings: object containing Polymatic settings

    Returns:
        result from :func:`~pysimm.lmps.md`
    """
    if settings.polym.step.cluster:
        nanohub = {'cores': int(settings.polym.step.nanohub_cores),
                   'walltime': int(settings.polym.step.nanohub_walltime)}
        log_name = 'step_%03d_%03d' % (bonds, attempt)
    else:
        nanohub = {}
        log_name = 'logs/step_%03d_%03d' % (bonds, attempt)

    if settings.polym.step.user_input:
        sim = lmps.Simulation(s, name='bond %s attempt #%d' % (bonds + 1, attempt),
                 print_to_screen=False, nanohub=nanohub, custom=True)
        sim.add(settings.polym.step.step_in)
        sim.run(np=settings.np, nanohub=nanohub)
    else:
        sim = lmps.Simulation(s, name='bond %s: attempt #%d' % (bonds + 1, attempt),
            print_to_screen=False, nanohub=nanohub,
            log=log_name
        )
        sim.add(lmps.Init(cutoff=settings.polym.step.nb_cutoff, forcefield=settings.forcefield))
        sim.add(lmps.Velocity(temperature=settings.polym.step.temp))
        sim.add_md(
            ensemble='nvt', temperature=settings.polym.step.temp,
            run=settings.polym.step.length,
        )
        sim.run(np=settings.np, nanohub=nanohub)

    if settings.polym.step.cluster:
        shutil.move(log_name, 'logs')

    return True
Exemple #4
0
def monomer(ff, is_capped=False):

    try:
        s = system.read_pubchem_smiles('CCc1=cc=cc=c1')
    except:
        import os
        s = system.read_mol(
            os.path.join(os.path.dirname(os.path.realpath(__file__)),
                         os.pardir, 'topologies', 'CCc1=cc=cc=c1.mol'))

    for b in s.bonds:
        if b.a.bonds.count == 3 and b.b.bonds.count == 3:
            b.order = 4

    c1 = s.particles[1]
    c5 = s.particles[5]
    c1.linker = 'head'
    c5.linker = 'tail'

    if not is_capped:
        for b in c1.bonds:
            if b.a.elem == 'H' or b.b.elem == 'H':
                pb = b.a if b.b is c1 else b.b
                s.particles.remove(pb.tag, update=False)
                break

        for b in c5.bonds:
            if b.a.elem == 'H' or b.b.elem == 'H':
                pb = b.a if b.b is c5 else b.b
                s.particles.remove(pb.tag, update=False)
                break
        s.remove_spare_bonding()

    s.apply_forcefield(ff, charges='gasteiger')
    s.set_box(padding=10)

    sim = lmps.Simulation(s, print_to_screen=False, log='ps_mon_relax.log')
    sim.add(lmps.Init())
    sim.add_min(min_style='fire')
    sim.run()

    s.add_particle_bonding()
    return s
Exemple #5
0
pim1_ld.dim.dz = ld_box_size

for idx in range(10):
    tmp = chains[idx].copy()
    tmp.shift_particles(*displ[2 * idx])
    pim1_ld.add(tmp, change_dim=False)

pim1_ld.wrap()
pim1_ld.set_density()
print('Density of the system is: {:} g/cc'.format(pim1_ld.density))
# pim1_ld = system.replicate(new_chains, [1] * len(new_chains), density=0.05, rand=False)

mimi = lmps.Simulation(pim1_ld, print_to_screen=False, log='mimimization.log')
mimi.add(
    lmps.Init(cutoff=14.0,
              special_bonds='amber',
              pair_modify={'mix': 'arithmetic'}))
mimi.add_min(min_style='sd',
             eol=1e-5,
             ftol=1e-5,
             maxiter=int(1e+5),
             maxeval=int(1e+6))
mimi.add_min(min_style='cg',
             eol=1e-5,
             ftol=1e-5,
             maxiter=int(1e+5),
             maxeval=int(1e+6))
mimi.run(np=6)

pim1_ld.write_lammps('pim1.smpl1.rndwlk.lmps')
Exemple #6
0
def mc_md(gas_sst,
          fixed_sst=None,
          mcmd_niter=None,
          sim_folder=None,
          mc_props=None,
          md_props=None,
          **kwargs):
    """pysimm.apps.mc_md

    Performs the iterative hybrid Monte-Carlo/Molecular Dynamics (MC/MD) simulations using :class:`~pysimm.lmps` for
    MD and :class:`~pysimm.cassandra` for MC

    Args:
        gas_sst (list of :class:`~pysimm.system.System`) : list items describe a different molecule to be
            inserted by MC
        fixed_sst (:class:`~pysimm.system.System`) : fixed during th MC steps group of atoms (default: None)


    Keyword Args:
        mcmd_niter (int) : number of MC-MD iterations (default: 10)
        sim_folder (str): relative path to the folder with all simulation files (default: 'results')
        mc_props (dictionary) : description of  all MC properties needed for simulations (see
            :class:`~pysimm.cassandra.GCMC` and :class:`~pysimm.cassandra.GCMC.props` for details)
        md_props (dictionary):  description of all Molecular Dynamics settings needed for simulations (see
            :class:`~pysimm.lmps.Simulation` and :class:`~pysimm.lmps.MolecularDynamics` for details)

    Returns:
        :class:`~pysimm.system.System`:
            Final state of the simulated system
    """

    nonrig_group_name = 'nonrigid_b'
    rig_group_name = 'rigid_b'
    n_iter = mcmd_niter or 10
    sim_folder = sim_folder or 'results'
    xyz_fname = os.path.join(sim_folder, 'MD{:}_out.xyz')
    l = 1

    # Creating fixed polymer system
    fs = None
    if fixed_sst:
        if isinstance(fixed_sst, system.System):
            fs = fixed_sst
            fs.wrap()
        else:
            print(
                'Cannot setup the fixed system for the simulations. Skipping this'
            )

    # Set the one-molecule gas systems
    gases = []
    if gas_sst:
        if isinstance(gas_sst, system.System):
            gases = [gas_sst]
        elif isinstance(gas_sst, types.ListType):
            for g in cassandra.make_iterable(gas_sst):
                if isinstance(g, system.System):
                    gases.append(g)

    if not gases:
        print(
            'There are no gas molecules were specified correctely\nThe gas molecules are needed to start the '
            'MC-MD simulations\nExiting...')
        exit(1)

    css = cassandra.Cassandra(fixed_sst)
    # Set the Monte-Carlo properties:
    mcp = mc_props
    if mcp:
        CHEM_POT = cassandra.make_iterable(mcp.get('Chemical_Potential_Info'))
        if not CHEM_POT:
            print('Missing chemical potential info\nExiting...')
            exit(1)
    else:
        print('Missing the MC Simulation settings\nExiting...')
        exit(1)
    mcp['Start_Type'] = OrderedDict([('species', [1] + [0] * len(CHEM_POT))])

    # Set the Molecular-Dynamics properties:
    sim = None
    mdp = md_props
    if not mdp:
        print('Missing the MD Simulation settings\nExiting...')
        exit(1)

    while l < n_iter + 1:
        mcp['Run_Name'] = str(l) + '.gcmc'

        css.add_gcmc(species=gases,
                     is_new=True,
                     chem_pot=CHEM_POT,
                     is_rigid=mcp.get('rigid_type') or [False] * len(gases),
                     out_folder=sim_folder,
                     props_file=str(l) + '.gcmc_props.inp',
                     **mcp)
        css.run()

        # >>> 2N: MD (LAMMPS) step:
        sim_sst = css.system
        sim_sst.write_lammps(
            os.path.join(sim_folder,
                         str(l) + '.before_md.lmps'))
        sim = lmps.Simulation(sim_sst,
                              debug=True,
                              log=os.path.join(sim_folder,
                                               str(l) + '.md.log'))

        sim.add(lmps.Init(cutoff=mdp.get('cutoff')))

        # custom definitions for the neighbour list updates
        sim.add_custom(
            'neighbor 1.0 nsq \nneigh_modify once no every 1 delay 0 check yes'
        )

        # adding group definitions to separate rigid and non-rigid bodies
        sim.add(
            lmps.Group('matrix', 'id',
                       css.run_queue[0].group_by_id('matrix')[0]))
        sim.add(
            lmps.Group(nonrig_group_name, 'id',
                       css.run_queue[0].group_by_id('nonrigid')[0]))
        rigid_mols = css.run_queue[0].group_by_id('rigid')[0]
        if rigid_mols:
            sim.add(lmps.Group(rig_group_name, 'id', rigid_mols))

        # adding "run 0" line before velocities rescale for correct temperature init of the system with rigid molecules
        sim.add(lmps.Velocity(style='create'))
        if rigid_mols:
            sim.add_custom('run 0')
            sim.add(lmps.Velocity(style='scale'))

        # create the description of the molecular dynamics simulation
        sim.add_md(
            lmps.MolecularDynamics(
                name='main_fix',
                group=nonrig_group_name if rigid_mols else 'all',
                ensemble='npt',
                timestep=mdp.get('timestep'),
                temperature=mdp.get('temp'),
                pressure=mdp.get('pressure'),
                run=False,
                extra_keywords={'dilate': 'all'} if rigid_mols else {}))

        # create the second NVT fix for rigid molecules that cannot be put in NPT fix
        if rigid_mols:
            sim.add(
                lmps.MolecularDynamics(name='rig_fix',
                                       ensemble='rigid/nvt/small molecule',
                                       timestep=mdp.get('timestep'),
                                       length=mdp.get('length'),
                                       group=rig_group_name,
                                       temperature=mdp.get('temp'),
                                       pressure=mdp.get('pressure'),
                                       run=False))

        # add the "spring tether" fix to the geometrical center of the system to avoid system creep
        sim.add_custom(
            'fix tether_fix matrix spring tether 30.0 0.0 0.0 0.0 0.0')
        sim.add(
            lmps.OutputSettings(thermo=mdp.get('thermo'),
                                dump={
                                    'filename':
                                    os.path.join(sim_folder,
                                                 str(l) + '.md.dump'),
                                    'freq':
                                    int(mdp.get('dump'))
                                }))
        sim.add_custom('run {:}\n'.format(mdp.get('length')))

        # The input for correct simulations is set, starting LAMMPS:
        sim.run(np=mdp.get('np', 1))

        # Updating the size of the fixed system from the MD simulations and saving the coordinates for the next MC
        css.system.dim = sim.system.dim
        sim.system.write_xyz(xyz_fname.format(l))
        mcp['Start_Type']['file_name'] = xyz_fname.format(l)
        mcp['Start_Type']['species'] = [1] + [0] * len(CHEM_POT)
        l += 1

    return sim.system if sim else None
Exemple #7
0
def mc_md(gas_sst, fixed_sst=None, mc_props=None, md_props=None, **kwargs):
    """pysimm.apps.mc_md

    Performs the iterative hybrid Monte-Carlo/Molecular Dynamics (MC/MD) simulations using :class:`~pysimm.lmps` for
    MD and :class:`~pysimm.cassandra` for MC

    Args:
        gas_sst (list of :class:`~pysimm.system.System`) : list items describe a different molecule to be
            inserted by MC
        fixed_sst (:class:`~pysimm.system.System`) : fixed during th MC steps group of atoms (default: None)


    Keyword Args:
        mcmd_niter (int) : number of MC-MD iterations (default: 10)
        sim_folder (str): relative path to the folder with all simulation files (default: 'results')
        mc_props (dictionary) : description of  all MC properties needed for simulations (see
            :class:`~pysimm.cassandra.GCMC` and :class:`~pysimm.cassandra.GCMC.props` for details)
        md_props (dictionary):  description of all Molecular Dynamics settings needed for simulations (see
            :class:`~pysimm.lmps.Simulation` and :class:`~pysimm.lmps.MolecularDynamics` for details)

    Returns:
        :class:`~pysimm.system.System`:
            Final state of the simulated system
    """

    nonrig_group_name = 'nonrigid_b'
    rig_group_name = 'rigid_b'
    n_iter = kwargs.get('mcmd_niter', 10)
    sim_folder = kwargs.get('sim_folder', 'results')
    xyz_fname = os.path.join(sim_folder, '{:}.md_out.xyz')
    lmps_fname = os.path.join(sim_folder, '{:}.before_md.lmps')

    # Define whether the simulations should be continued or start from the scratch
    l = 1
    is_restart = kwargs.get('restart')
    if is_restart:
        for f in glob.glob(lmps_fname.format('*')):
            l = max(l, int(re.match('\A\d+', os.path.split(f)[1]).group()))

        to_purge = glob.glob(os.path.join(sim_folder, '{:}.*'.format(l + 1))) + \
                   glob.glob(os.path.join(sim_folder, '{:}.md*'.format(l)))
        for f in to_purge:
            os.remove(f)
    # Creating fixed polymer system
    fs = None
    if fixed_sst:
        if isinstance(fixed_sst, system.System):
            fs = fixed_sst
            fs.wrap()
        else:
            print('Cannot setup the fixed system for the simulations. Skipping this')

    # Set the one-molecule gas systems
    gases = []
    if gas_sst:
        if isinstance(gas_sst, system.System):
            gases = [gas_sst]
        elif isinstance(gas_sst, types.ListType):
            for g in cassandra.make_iterable(gas_sst):
                if isinstance(g, system.System):
                    gases.append(g)

    if not gases:
        print('There are no gas molecules were specified correctely\nThe gas molecules are needed to start the '
              'MC-MD simulations\nExiting...')
        exit(1)

    css = cassandra.Cassandra(fixed_sst)
    # Set the Monte-Carlo properties:
    mcp = mc_props
    if mcp:
        CHEM_POT = cassandra.make_iterable(mcp.get('Chemical_Potential_Info'))
        if not CHEM_POT:
            print('Missing chemical potential info\nExiting...')
            exit(1)
    else:
        print('Missing the MC Simulation settings\nExiting...')
        exit(1)
    mcp['Start_Type'] = OrderedDict([('species', [1] + [0] * len(CHEM_POT))])

    # Set the Molecular-Dynamics properties:
    sim = None
    mdp = md_props
    if not mdp:
        print('Missing the MD Simulation settings\nExiting...')
        exit(1)

    # De-synchronizing type names of the framework and the gases to avoid consolidation of types that PySIMM system does
    for gi, g in enumerate(gases):
        for pt in g.particle_types:
            pt.name += '_g' + str(gi + 1)

    while l < n_iter + 1:
        # >>> MC (CASSANDRA) step:
        mcp['Run_Name'] = str(l) + '.gcmc'

        css.add_gcmc(species=gases, is_new=True, chem_pot=CHEM_POT,
                     is_rigid=mcp.get('rigid_type') or [False] * len(gases),
                     out_folder=sim_folder, props_file=str(l) + '.gcmc_props.inp', **mcp)

        if is_restart:
            # Set gas particles positions from the .chk file, and update some properties
            css.run_queue[-1].upd_simulation()
            css.system = css.run_queue[-1].tot_sst.copy()
            # Set frame particles position and box size dimension from the .lmps file
            tmp_sst = system.read_lammps(lmps_fname.format(l))
            for p in css.system.particles:
                p.x = tmp_sst.particles[p.tag].x
                p.y = tmp_sst.particles[p.tag].y
                p.z = tmp_sst.particles[p.tag].z
            css.system.dim = tmp_sst.dim
            is_restart = False
        else:
            css.run()
            css.system.write_lammps(lmps_fname.format(l))

        nm_treads = '1'
        if 'OMP_NUM_THREADS' in os.environ.keys():
            nm_treads = os.environ['OMP_NUM_THREADS']
        os.environ['OMP_NUM_THREADS'] = '1'

        # >>> MD (LAMMPS) step:
        sim_sst = css.system.copy()
        sim_sst.write_lammps(os.path.join(sim_folder, str(l) + '.before_md.lmps'))
        sim = lmps.Simulation(sim_sst, print_to_screen=mdp.get('print_to_screen', False),
                              log=os.path.join(sim_folder, str(l) + '.md.log'))

        sim.add(lmps.Init(cutoff=mdp.get('cutoff'),
                          special_bonds=mdp.get('special_bonds'),
                          pair_modify=mdp.get('pair_modify')))

        # custom definitions for the neighbour list updates
        sim.add_custom('neighbor 1.0 nsq \nneigh_modify once no every 1 delay 0 check yes')

        # adding group definitions to separate rigid and non-rigid bodies
        sim.add(lmps.Group('matrix', 'id', css.run_queue[0].group_by_id('matrix')[0]))
        sim.add(lmps.Group(nonrig_group_name, 'id', css.run_queue[0].group_by_id('nonrigid')[0]))
        rigid_mols = css.run_queue[0].group_by_id('rigid')[0]
        if rigid_mols:
            sim.add(lmps.Group(rig_group_name, 'id', rigid_mols))

        # create the description of the molecular dynamics simulation
        if type(mdp.get('timestep')) == list:

            sim.add(lmps.OutputSettings(thermo=mdp.get('thermo'),
                                        dump={'filename': os.path.join(sim_folder, str(l) + '.md.dump'),
                                              'freq': int(mdp.get('dump'))}))

            for it, (t, lng) in enumerate(zip(mdp.get('timestep'), mdp.get('length'))):

                sim.add(lmps.Velocity(style='create'))
                # adding "run 0" line before velocities rescale for correct temperature init of the
                # system with rigid molecules
                if rigid_mols:
                    sim.add_custom('run 0')
                    sim.add(lmps.Velocity(style='scale'))

                sim.add_md(lmps.MolecularDynamics(name='main_fix_{}'.format(it),
                                                  group=nonrig_group_name if rigid_mols else 'all',
                                                  ensemble='npt',
                                                  timestep=t,
                                                  temperature=mdp.get('temp'),
                                                  pressure=mdp.get('pressure'),
                                                  run=False,
                                                  extra_keywords={'dilate': 'all'} if rigid_mols else {}))

                # create the second NVT fix for rigid molecules that cannot be put in NPT fix
                if rigid_mols:
                    sim.add(lmps.MolecularDynamics(name='rig_fix_{}'.format(it),
                                                   ensemble='rigid/nvt/small molecule',
                                                   timestep=t,
                                                   length=mdp.get('length'),
                                                   group=rig_group_name,
                                                   temperature=mdp.get('temp'),
                                                   pressure=mdp.get('pressure'),
                                                   run=False))
                sim.add_custom('fix        tether_fix_{} matrix spring tether 30.0 0.0 0.0 0.0 0.0'.format(it))

                sim.add_custom('run {:}\n'.format(lng))
                sim.add_custom('unfix main_fix_{:}'.format(it))
                sim.add_custom('unfix rig_fix_{:}'.format(it))
                sim.add_custom('unfix tether_fix_{:}'.format(it))

        else:
            sim.add_md(lmps.MolecularDynamics(name='main_fix',
                                              group=nonrig_group_name if rigid_mols else 'all',
                                              ensemble='npt',
                                              timestep=mdp.get('timestep'),
                                              temperature=mdp.get('temp'),
                                              pressure=mdp.get('pressure'),
                                              run=False,
                                              extra_keywords={'dilate': 'all'} if rigid_mols else {}))

            # create the second NVT fix for rigid molecules that cannot be put in NPT fix
            if rigid_mols:
                sim.add(lmps.MolecularDynamics(name='rig_fix',
                                               ensemble='rigid/nvt/small molecule',
                                               timestep=mdp.get('timestep'),
                                               length=mdp.get('length'),
                                               group=rig_group_name,
                                               temperature=mdp.get('temp'),
                                               pressure=mdp.get('pressure'),
                                               run=False))

            # add the "spring tether" fix to the geometrical center of the system to avoid system creep
            sim.add_custom('fix tether_fix matrix spring tether 30.0 0.0 0.0 0.0 0.0')
            sim.add(lmps.OutputSettings(thermo=mdp.get('thermo'),
                                        dump={'filename': os.path.join(sim_folder, str(l) + '.md.dump'),
                                              'freq': int(mdp.get('dump'))}))
            sim.add_custom('run {:}\n'.format(mdp.get('length')))

        # The input for correct simulations is set, starting LAMMPS:
        sim.run(prefix=[''])
        os.environ['OMP_NUM_THREADS'] = nm_treads

        # Updating the size of the fixed system from the MD simulations and saving the coordinates for the next MC
        # css.system.dim = sim.system.dim
        css.system = sim.system.copy()
        css.unwrap_gas()
        css.system.write_xyz(xyz_fname.format(l))

        mcp['Start_Type']['file_name'] = xyz_fname.format(l)
        mcp['Start_Type']['species'] = [1] + css.run_queue[-1].mc_sst.made_ins
        l += 1

    return sim.system if sim else None