Name: Ha H. Dang
Class: 3.016
Professor W Craig Carter
Doctor Kyle Keane
3.016 teaching assistants

Nanoparticle-Polymer Network

Visualize and simulation of a network of polymer and particles in which particles and polymers can have favorable interaction to cross link and form a network

Polymers are macromolecules composed of hundred to thousands subunits. They can adopt many configurations, depending on the identity of their subunits. We can have polymers either so rigid that they have a rod-like configuration or so flexible that they form a random coil configuration. Common examples of polymers are PVC, PS, teflon, etc.

When particles and polymers of favorable interactions are mixed, it is not always apparent whether they will form a cross-linked network. If the end-to-end distance of the polymers is shorter than the distance between 2 particles, no polymer-particle network will form.

This project will focus on visualizing the interaction between particles and polymers given the polymer’s length (number of subunits).

Stage 1: Making A Random Walk Polymer

Set particles as lattice of positive charge

one particle is randomly selected

A polymer, which is a random walker, spawn from that site and can walk N number of steps (N is the number of the polymer’s subunits). The random walk process is similar to the polymer growing process.

(*Polymer starts at a random lattice site*)
start=RandomInteger[{0,5},2];

(*Particles are situated at a lattice site*)
particles=Tuples[Range[-5,10],2];

(*Initiation Values*)
numberOfSteps=1000; (*This is the length of the polymer*)
path={};
r=0.3; (*radius of particles*)
effectiveLength=r+0.03; (*the effective length is where the particle really does the random walk due to some conformation restriction from the the surface of the particles*)
angle=RandomReal[{0,2Pi}];
current=start+effectiveLength*{Cos[angle],Sin[angle]};

(*Random Walk Simulation*)
i=1;
While[
i≤numberOfSteps,
i++;
AppendTo[path,current];
stepSize=0.08;
stepAngle=RandomReal[{0,2Pi}];
step=stepSize {Cos[stepAngle],Sin[stepAngle]};
current=current+step;
]

Graphics[{
Red,Disk[#,r]&/@particles,
Green,Line@path,
Blue,Disk[path[[1]],0.04],(*Where the polymer starts*)
Orange,Disk[path[[-1]],0.04](*Where the polymer ends*)
}]

Stage 2: Visualize Many Polymers in the Particle Lattice Sites

r=0.3; (*radius of the particles. Typical step length of a polymer is about 5Å. The smallest radius of nanoparticles is around 5nm. So the radius of a particle is 10 times longer than a subunit of the polymer. We later set the step size to be 0.03 to match this different in magnitude between nanoparticle's radius and polymer's step length*);

particleDistribution=Tuples[Range[-5,5],2];

polymerRandomWalk[polymerLength_,particleLattice_]:=Module[
(*number of steps tell the length of the polymer. Particle distribution tells the position of the particles*)

{latticeSite,path,effectiveLength,angle,current,i,
stepSize,stepAngle,step,tests,surfaceStartingPoint},

(*Polymer starts at a random lattice site*)
latticeSite=RandomChoice[particleLattice];

(*Initiation*)
path={};
(*The polymer will do random walk after reaching the effective length - a certain distance from the surface of a nanoparticle*)
effectiveLength=0.2;
angle=RandomReal[{0,2Pi}];
current=latticeSite+effectiveLength*{Cos[angle],Sin[angle]};

(*Random Walk Simulation*)
i=1;
While[
i≤polymerLength,
i++;
AppendTo[path,current];
stepSize=0.03;
stepAngle=RandomReal[{0,2Pi}];
step=stepSize {Cos[stepAngle],Sin[stepAngle]};
current=current+step;
];

(*Return path*)
path
]

manyPolymers=Table[polymerRandomWalk[1000,particleDistribution],100];

image1=Graphics[{
Red,Disk[#,0.3]&/@particleDistribution,
Blue,Line[#]&/@manyPolymers
}]

Stage 3: Calculate the probability of cross-linking by counting polymers that wrap around more than 2 particles.

Count the number of successfully cross-linked polymers by using region member

crossLinkSuccess[polymerPath_]:=Module[
{polymerStart,position,startingParticle,neighboringSites,crossLinkTest,i,subunit,success},
polymerStart=polymerPath[[1]];
(*polymerPath gives a list of polymer's subunits. We want to test whether a subunit touches neighboring particles. In order to do so, we need to keep track of where the polymer spawns*)

(*We find the spawning site by running RegionMember test accross all the lattice site. Record the site that yield True to the test*)
position=Position[RegionMember[Disk[#,0.3],polymerStart]&/@particleDistribution,True][[1,1]];
startingParticle=particleDistribution[[position]];

(*Once we find the spawning site, we exclude it from the lattice site to obtain the neighboring pariticle sites*)
neighboringSites=DeleteCases[particleDistribution,startingParticle];

(*We run Regionmember test for each subunit across all neighboring lattice sites*)
crossLinkTest=RegionMember[Disk[#,0.3]]&/@neighboringSites;

(*If a subunit touches the particles, we record 1. Otherwise, we record 0*)
success=Table[
subunit=polymerPath[[i]];
If[MemberQ[#[subunit]&/@crossLinkTest,True],1,0],
{i,1,Length@polymerPath}
];
If[MemberQ[success,1],1,0]
]

successList=crossLinkSuccess[#]&/@manyPolymers

ratioOfCrossLinks=N[Length@Cases[successList,1]/Length@successList]

(*Below is the function that calculate the ratio of polymers that link two or more particles*)
crossLinkRatioForPolymersOfSameLength[polymerList_]:=Module[
{resultsOfCrossLinkTest,crossLinkRatio},
(*Out of the input list of polymers, determine whether a polymer cross (1) or no cross (0)*)
resultsOfCrossLinkTest=crossLinkSuccess[#]&/@polymerList;
(*Count how many polymer cross linked by counting the number of 1's and divide by the length of the list to obtain the ratio*)
crossLinkRatio=N[Length@Cases[resultsOfCrossLinkTest,1]/Length@successList]
]

Find the ratio of cross links for polymers of different length

polymer100=Table[polymerRandomWalk[100,particleDistribution],100];

crossLinkRatioPolymer100=crossLinkRatioForPolymersOfSameLength[polymer100]

polymer200=Table[polymerRandomWalk[200,particleDistribution],100];
crossLinkRatioPolymer200=crossLinkRatioForPolymersOfSameLength[polymer200]

polymer500=Table[polymerRandomWalk[500,particleDistribution],100];
crossLinkRatioPolymer500=crossLinkRatioForPolymersOfSameLength[polymer500]

polymer800=Table[polymerRandomWalk[800,particleDistribution],100];
crossLinkRatioPolymer800=crossLinkRatioForPolymersOfSameLength[polymer800]

polymer1000=Table[polymerRandomWalk[1000,particleDistribution],100];
crossLinkRatioPolymer1000=crossLinkRatioForPolymersOfSameLength[polymer1000]

polymer1500=Table[polymerRandomWalk[1500,particleDistribution],100];
crossLinkRatioPolymer1500=crossLinkRatioForPolymersOfSameLength[polymer1500]

ListPlot probability of cross linking as a function of polymer

data={{100,crossLinkRatioPolymer100},{200,crossLinkRatioPolymer200},{500,crossLinkRatioPolymer500},{800,crossLinkRatioPolymer800},{1000,crossLinkRatioPolymer1000},{1500,crossLinkRatioPolymer1500}};

crossLinkingProbability=ListPlot[
data,
Frame-> True,FrameLabel-> {"Polymer Length (# subunits)","Probability to cross-link with particles"}]

There is definitely a positive correlation between cross linking probability and polymer length. As the polymer gets longer, there is a higher change that it will cross over at least another particle. This trend makes sense because as the polymer gets longer, it covers a larger distance and has a higher probability to hit particles.

leastSquareFit=Fit[data, {1,Log[x]},x]

Show[
crossLinkingProbability,
Plot[leastSquareFit,{x,0,1500},PlotStyle->Dashed]
]

The log graph suggests that there is a minimum polymer length that will cross-link nanoparticles. Moreover, as the polymer gets longer, the probability of cross-linking plateau, suggesting that there is such an optimal polymer length that any polymer longer than that will not increase the probability of cross-linking.

However, this probability does not tell any information about the network of polymers and particles as a whole. There is a need to analyze the nanoparticle-polymer network.

Stage 4: Nanoparticle-Polymer Network Analysis

Single Polymer

Spawn a random walk polymer

Go through each step (subunit) and see if it is a region member

Collapse into a graph connector

testPolymer=RandomChoice[polymer800];
latticeSites=Disk[#,r]&/@particleDistribution;

singlePolymerCrossLinkTest[singlePolymer_]:=Flatten[
Map[
Function[
{polymerSubunits},
Select[latticeSites,RegionMember[#,polymerSubunits]&]
],
singlePolymer
],
1]

crossingSites=First/@Split[singlePolymerCrossLinkTest@testPolymer](*This polymer connect 2 particle sites*)

CrossingCordinates=First/@crossingSites

vertices=ToString/@CrossingCordinates

In order to visualize the connectedness between nanoparticles and polymers, we use graphs, and in order to do so, we need to form edges between vertices

edges=UndirectedEdge@@@Partition[vertices,2,1]

Graph[edges] (*This shows you that the testpolymer connect two particle sites*)

We want to do this simulation for all polymers and particles to visualize the connectedness within our polymer-nanoparticle network. Then use cluster analysis to analyze the network formed by mixing polymers and nanoparticles together.

Multiple Polymers

multiplePolymerCrossLink[polymerList_]:=(First/@Split[singlePolymerCrossLinkTest[#]])&/@polymerList

results=multiplePolymerCrossLink[polymer800]

crossingParticleSites=Map[First/@#&,results];

particleVertices=Map[ToString,crossingParticleSites,{2}];

edges=UndirectedEdge@@@Partition[#,2,1]&/@particleVertices;

connectednessGraph=Graph[Flatten@edges]

polymer800ClusterGraph=CommunityGraphPlot[connectednessGraph,FindGraphCommunities[connectednessGraph],PlotLabel-> "Cluster Network of 800-subunit Polymer"]

The community graph plot shows several regions of highly cross-linking between polymers and nanoparticles. However, majority of those regions are not interconnected. As a results, a network of polymers and nanoparticles is unlikely to be formed at this polymer length and polymer concentration.

Vary polymer length and see whether that will improve the connectedness between clusters

results2=multiplePolymerCrossLink[polymer1000];

crossingParticleSites=Map[First/@#&,results2];
particleVertices=Map[ToString,crossingParticleSites,{2}];
edges=UndirectedEdge@@@Partition[#,2,1]&/@particleVertices;
connectednessGraph=Graph[Flatten@edges];
polymer1000ClusterGraph=CommunityGraphPlot[connectednessGraph,FindGraphCommunities[connectednessGraph],PlotLabel-> "Cluster Network of 1000-subunit Polymer"];

GraphicsRow[{
polymer800ClusterGraph,
polymer1000ClusterGraph
}]

An increase in polymer length seems to increase the connection between clusters.

Stage 5: A more realistic way to spawn polymer

In a realistic system of polymers and nanoparticles which have favorable interaction, once the polymer hit a nanoparticle, it will stick to that nanoparticle. 
In the system that we used above, polymers are allowed to walk in such as way that does not take into account the interaction between nanoparticles and polymer.
In the following, we will attempt to take into account that interaction by using these algorithm steps:

Make a lattice of nanoparticle sites

one randomly gets selected

a random walker spawns from that site and can walk

if random walker hits any charge site, including the original one, then sticks to it

particleDistribution=Tuples[Range[0,5],2];

modifiedPolymerRandomWalk[numberOfSteps_,particleDistribution_]:=Module[
(*number of steps tell the length of the polymer. Particle distribution tells the position of the particles*)

{latticeSite,path,r,startingPoint,effectiveLength,angle,current,i,
stepSize,stepAngle,step,surfaceTest},

(*Polymer starts at a random lattice site*)
latticeSite=RandomChoice[particleDistribution];

(*Initiation Values*)
path={};
r=0.3;(*radius of the particle*)
angle=RandomReal[{0,2Pi}];
(*Polymer will spawn on the surface of a particle*)
startingPoint=latticeSite+r{Cos[angle],Sin[angle]};
AppendTo[path,startingPoint];
(*The polymer will truely random walk after reaching the effective lenth*)
effectiveLength=0.06; 
current=startingPoint+effectiveLength{Cos[angle],Sin[angle]};

(*Random Walk Simulation*)
i=1;
While[
i≤numberOfSteps,
i++;
AppendTo[path,current];

(*We need to check whether current touches the surface of a particle. If it does, polymer random walker stops*)
surfaceTest=RegionMember[Disk[#,r]]&/@particleDistribution;
If[MemberQ[#[current]&/@surfaceTest,True],Break[]];

stepSize=0.03;
stepAngle=RandomReal[{0,2Pi}];
step=stepSize {Cos[stepAngle],Sin[stepAngle]};
current=current+step;
];

(*Return path*)
path
]

example=Table[modifiedPolymerRandomWalk[1000,particleDistribution],100];

Graphics[{
Red,Disk[#,0.3]&/@particleDistribution,
Blue,Line[#]&/@example
}]

Although this approach takes into account the interaction between nanoparticles and polymers, it is still not a realistic representation of the real system. In this approach, we let a polymer subunit spawn on the particle surface and grow into a polymer. In a real system, polymers are thrown into a disperse solution of particles. The conformation of polymers is a dynamic process in which the entire polymer twists, turns so that the two ends of the polymer find nanoparticle surfaces. This project has not taken into the dynamic conformation of polymers in a dilute solution.

Stage 6: Future research

Take into account polymer confirmation when doing polymer random walk

Find how polymer concentration and nanoparticle concentration affect the nanoparticle-polymer network by doing cluster analysis.

Thank you Dr. Keane for your guidance on this project.