Source code for snap_simulate.system.molecules.linear_polymer

import numpy as np


[docs] def make_linear_polymer(mol_specs, particle_specs): mol_type = mol_specs.pop("molecule_type") if mol_type != "linear_polymer": raise Exception(f"Cannot turn molecule of type {mol_type} into a linear polymer") beads = mol_specs["beads"] bead_types = mol_specs["bead_types"] bond_type = mol_specs["bond_type"] # Convert bead_types to a list if a single int is provided if isinstance(bead_types, int): bead_types = [bead_types] * beads elif len(bead_types) != beads: if len(bead_types) < beads: raise Exception("Length of bead_types must match beads count") diameters = particle_specs["diameters"] particle_positions = np.zeros((beads, 3), dtype=float) particle_typeid = np.zeros(beads, dtype=int) # Set bead types for i in range(beads): particle_typeid[i] = bead_types[i] # Calculate x coordinates based on consecutive bead radii x = 0.0 particle_positions[0, 0] = x for i in range(1, beads): r_prev = diameters[bead_types[i-1]] / 2.0 r_curr = diameters[bead_types[i]] / 2.0 x += (r_prev + r_curr) particle_positions[i, 0] = x # Generate sequential bonds nbonds = beads - 1 bond_groups = np.zeros((nbonds, 2), dtype=int) bond_typeid = np.zeros(nbonds, dtype=int) + bond_type for i in range(nbonds): bond_groups[i] = [i, i+1] angle_groups = [] angle_typeid = [] if "angle_type" in mol_specs and mol_specs["angle_type"] is not None: angle_type = mol_specs["angle_type"] for i in range(beads - 2): angle_groups.append([i, i+1, i+2]) angle_typeid.append(angle_type) new_mol_specs = dict( bond_typeid=bond_typeid.tolist(), bond_groups=bond_groups.tolist(), angle_typeid=angle_typeid, angle_groups=angle_groups, particle_typeid=particle_typeid.tolist(), particle_positions=particle_positions.tolist() ) return new_mol_specs