MOLECULAR DYNAMICS SIMULATIONS OF
HEMATITE NANOPARTICLE DEPOSITION ONTO A SUBSTRATE
By
DANA R. LOUIE
B.S., Mechanical Engineering, Ohio University, 1989
M.S., Aerospace Engineering, University of Florida, 1992
A thesis submitted to the Graduate Faculty of the
University of Colorado at Colorado Springs
In partial fulfillment of the
Requirements for the degree of
Master of Science
Department of Physics
2014
This thesis for the Master of Science degree by
Dana R. Louie
Has been approved for the
Department of Physics
By
______________________________________________
Dr. Karen Livesey, Chair
______________________________________________
Dr. Anatoliy Pinchuk
______________________________________________
Dr. Kathrin Spendier
__________________________
Date
iii
Louie, Dana R. (M.S., Applied Science--Physics)
Molecular Dynamics Simulations of Hematite Nanoparticle Deposition onto a Substrate
Thesis directed by Assistant Professor Karen Livesey
Hematite nanoparticle deposition onto a silicon dioxide substrate in hexane solution was
examined to ascertain whether deposition time and rate vary depending on the number of particles
in the system, and to determine whether ordered patterns form on the substrate surface. Average
deposition time for all particles to reach the substrate was higher for systems with greater numbers
of particles. Deposition rate was established by fitting the average height above the substrate for
all particles versus time with an exponential curve. From the curve fit, time constant was
determined. The time constant was slightly higher for systems with greater numbers of particles.
Ordered patterns formed on the substrate surface after the particles had settled, and the patterns
were better ordered for systems with larger numbers of particles.
A Fortran simulation program was developed to support this study. The program included
viscous and fluctuating forces due to particle immersion in the hexane fluid, Van der Waals and
steric forces between particles, gravity, and the Van der Waals force acting between each particle
and the substrate. Interparticle Van der Waals and steric forces were modeled with the Lennard-
Jones force. The Lennard-Jones model was more computationally efficient than employing
individual interparticle Van der Waals and steric forces. However, for particles at close distances,
the magnitude of the Lennard-Jones repulsive force was less than that of the sum of the Van der
Waals and steric forces, and thus could have slightly affected the pattern formed on the substrate.
Future studies should investigate employing individual Van der Waals and steric forces in place of
the Lennard-Jones approximation.
DEDICATION
I dedicate this thesis to my husband Jeff. Thank you always for your steadfast, unwavering
support.
“Being deeply loved by someone gives you strength, while loving someone deeply gives
you courage.” – Lao Tzu
ACKNOWLEDGEMENTS
I would like to acknowledge Dr. Karen Livesey and Dr. Bob Camley for their support
throughout my graduate program at University of Colorado, Colorado Springs. Dr. Livesey, as my
committee chair and thesis advisor, devoted countless hours in guiding me through this project and
teaching me skills and knowledge essential in conducting research. Dr. Camley, as graduate student
advisor, first met with me when I applied to the program and led me to the best path of success in
accomplishing my goals. After completing this program at UCCS, I will continue in a PhD program
in Astronomy this Fall. I thank you both for helping me to begin this new journey in my life
towards becoming a professional Astronomer.
TABLE OF CONTENTS
CHAPTER 1 ...................................................................................................................... 1
INTRODUCTION
CHAPTER 2 ...................................................................................................................... 4
BACKGROUND ON COLLOIDS AND
COLLOIDAL FORCES SIMULATED FOR THIS PROJECT
2.1. Van der Waals Forces ...................................................................................................... 5
2.2. Steric Forces .................................................................................................................... 6
2.3. Lennard-Jones Potential ................................................................................................... 8
CHAPTER 3 .................................................................................................................... 11
SIMULATION DEVELOPMENT
3.1. Molecular Dynamics ...................................................................................................... 11
3.2. Periodic Boundary Conditions ....................................................................................... 15
3.3. Random Number Generation. ........................................................................................ 17
3.4. Initial Conditions ........................................................................................................... 18
3.5. Langevin Equation ......................................................................................................... 19
3.6. Incorporating the Langevin Equation into a Molecular Dynamics Routine .................. 22
3.6.1. Determination of Best Time Step ............................................................................ 23
3.6.2. Simulation Compared to Equipartition Theorem .................................................... 25
3.6.3. Random Walk Motion ............................................................................................. 25
vii
3.7. Euler Method Used for Stochastic Dynamics ................................................................ 29
3.8. Effects of Gravity on Colloidal Particles ....................................................................... 30
CHAPTER 4 .................................................................................................................... 32
APPLICATION OF MOLECULAR DYNAMICS SIMULATION TO
HEMATITE NANOPARTICLE DEPOSITION ONTO A SUBSTRATE
4.1. Introduction .................................................................................................................... 32
4.2. Deposition Time ............................................................................................................ 33
4.3. Deposition Rate.............................................................................................................. 38
4.4. Pattern Formation .......................................................................................................... 41
CHAPTER 5 .................................................................................................................... 48
SUMMARY, FUTURE WORK, AND CONCLUDING REMARKS
5.1. Summary ........................................................................................................................ 48
5.2. Future Work ................................................................................................................... 49
5.2.1. Improve the Force Model ........................................................................................ 49
5.2.2. Develop a More Quantitative Pattern Analysis Technique ..................................... 50
5.2.3. Simulate a More Realistic Substrate ....................................................................... 51
5.2.4. Vary Parameters to Determine Effect on Deposition Pattern ................................. 51
5.2.5. Optimize the Fortran algorithm ............................................................................... 51
5.3. Concluding Remarks ...................................................................................................... 52
APPENDIX 1 ................................................................................................................... 54
EQUATIONS FOR VAN DER WAALS ENERGIES AND FORCES
APPENDIX 2 ................................................................................................................... 58
REPRESENTATIVE MAGNITUDES OF FORCES USED IN THIS STUDY
viii
APPENDIX 3 ................................................................................................................... 59
NUMERICAL INTEGRATION SCHEME DESCRIPTIONS
A3.1. Euler Method .............................................................................................................. 59
A3.2. Verlet Algorithm ......................................................................................................... 60
A3.3. Leapfrog Algorithm .................................................................................................... 61
A3.4. Velocity Verlet Algorithm .......................................................................................... 62
A3.5. Velocity Verlet/Leapfrog Algorithm .......................................................................... 64
A3.6. Leap-Frog Algorithm for Stochastic Dynamics .......................................................... 64
APPENDIX 4 ................................................................................................................... 68
RANDOM NUMBER GENERATION
A4.1. Uniform Random Number Generators ........................................................................ 68
A4.2. Gaussian Random Number Generators ....................................................................... 71
APPENDIX 5 ................................................................................................................... 74
SIMULATION ALGORITHMS
A5.1. Three-Dimensional Stochastic Dynamics Algorithm ................................................. 74
to Model Hematite Nanoparticle Deposition onto a Substrate
A5.2. Two-Dimensional Stochastic Dynamics Algorithm ................................................... 89
to Model Particle Motion on the Substrate
APPENDIX 6 ................................................................................................................. 100
ADDITIONAL FIGURES
A6.1. Initial Particle Positions for Systems with Various Numbers of Particles ................ 100
A6.2. Additional Figures Supporting Deposition Time and Rate Analysis ........................ 101
A6.3. Additional Figures Supporting Pattern Formation Analysis ..................................... 103
ix
APPENDIX 7 ................................................................................................................. 108
DATA SUPPORTING DEPOSITION TIME AND RATE ANALYSIS
BIBLIOGRAPHY ......................................................................................................... 113
CHAPTER 1
INTRODUCTION
The goal of this project was to simulate the deposition of hematite nanoparticles onto a
silicon dioxide substrate in order to compare particle deposition times and rates for systems with
different numbers of particles, and to determine whether patterns were formed once particles had
settled onto the substrate surface. Figure 1 shows a simplified depiction of the system under study.
The nanoparticles studied were coated with a surfactant and immersed in a hexane solution. A
molecular dynamics Fortran program was developed to simulate the system under study, and
deposition times and locations were recorded for all particles as they settled onto the substrate
surface.
In order to isolate the effects of the
number of system particles on the results,
only particles of one size and with one
surfactant coating were considered. In
addition, forces assumed to play a minor role
in deposition rate and pattern formation—
such as magnetic interactions between the
particles—were ignored. The forces that
were taken into account included viscous and
fluctuating forces, Van der Waals and steric
forces between particles, gravity, and the Van
Figure 1. Visualization of system under study.
Nanoparticles represented as spheres, and surfactant
coating—or ligand shell—represented with curly
strands.
2
Der Waals force acting between each particle and the substrate. Van der Waals and steric potentials
between the particles were simulated using a Lennard-Jones potential.
Magnetic iron oxide nanoparticles such as hematite, magnetite, and maghemite have
unique properties that can be applied to a variety of situations. (Teja and Koh) Hematite deposited
onto a substrate has direct applications as a catalyst in reactions important to industry. For example,
hematite is a relatively low-cost alternative that can be used in catalytic combustion to remove
volatile organic compounds from industrial waste products, and thus is important in protecting the
environment. (Picasso, Quintilla and Pina) To place iron oxide nanoparticles onto a substrate,
some processes form the nanoparticles in-situ as the substrate itself is made, but forming the
nanoparticles separately and then depositing them onto the substrate—as modeled in this study—
offers advantages in that there is more control over particle size and composition, and particles tend
to be more dispersed on the substrate. (Hondow and Fuller) Since deposition of pre-formed
particles onto a substrate is a relatively new research area, questions remain about the assemblage
rate and formation of patterns on the substrate. This study takes some initial steps toward
examining these questions.
Results showed that mean deposition time for all system particles to settle onto a substrate
was longer for systems with greater numbers of particles. However, the last few particles to reach
the substrate took considerably longer in larger systems, partially accounting for the higher mean
deposition times. Deposition rate was examined by determining the time constant corresponding
to systems with various numbers of particles. The time constant was determined for all simulation
runs by examining the average height above the substrate for all particles over time, and fitting the
data with an exponential curve. Comparison of the time constant between systems with different
numbers of particles showed that the fall time was again longer for systems with greater numbers
of particles. However, the difference between systems with different numbers of particles was not
as pronounced as the result for mean deposition time. After particles had deposited onto the
substrate, qualitative and quantitative analyses showed that patterns did indeed form on the
3
substrate surface. Patterns were better ordered or more correlated for systems with larger numbers
of particles. The results indicate that when depositing hematite nanoparticles onto a substrate, a
solution with a greater number of particles should be chosen to attain the best particle distribution
on the substrate in the optimum amount of time.
The following chapters discuss the detailed procedures and results for this study. Chapter
2 presents an overview on colloids and the forces that act on a colloidal system. The chapter also
discusses the Lennard-Jones force used to model the Van der Waals and steric interparticle forces.
Chapter 3 describes development of the Fortran simulation program used in this study, to include
various tests used to verify proper function of the algorithm. Chapter 4 presents the detailed results
of the hematite nanoparticle deposition simulations. Finally, Chapter 5 summarizes this study, and
presents an overview of work to be accomplished in the future. The appendices provide additional
supporting material and are referenced where applicable throughout this report.
CHAPTER 2
BACKGROUND ON COLLOIDS AND
COLLOIDAL FORCES SIMULATED FOR THIS PROJECT
A colloid is a dispersion of small particles in some medium. (Israelachvili p. xxix)
Common everyday examples of colloids include paint, ink, and milk. The focus of this study was
to examine hematite nanoparticles dispersed in hexane solution. While developing the Fortran
simulation program used in this study, a dispersion of magnetite nanoparticles in blood was also
examined.a In general, the term nanoparticle is used to refer to particles ranging in size from 1 to
100 nm.
In this project, a colloidal system of nanoparticles located above a substrate was simulated
as the particles settled onto the substrate. In general, a colloid may be described as being either
stable or unstable, depending upon whether the particles in suspension are well dispersed or form
clumps. If we look at the common everyday examples of colloids mentioned previously, we know
that milk is generally stable because the colloidal particles do not settle out of solution. However,
if rennet is added to milk, the colloidal particles clump together to form a gel, which can be cut into
curds and then compressed together to make the delicious product called cheese. The reason the
colloidal particles clump when rennet is added is that the interparticle forces have been affected so
that the attractive forces between particles are stronger than the repulsive forces. (Rennet
Coagulation of Milk) In general, the degree of stability is affected by the forces acting between
dispersed particles. (Valle-Delgado) In this study, if stable patterns were to form as the
a Magnetite has biomedical applications due to its biocompatibility with the human body. (Teja and Koh)
5
nanoparticles settled onto the substrate, a certain balance had to be achieved between attractive and
repulsive forces that acted between particles.
Forces that can typically act on particles in solution include Van der Waals forces, electric
double-layer forces, magnetic forces, solvation forces, and steric forces. (Israelachvili p. 284) This
study focused on Van der Waals forces between particles, Van der Waals forces between each
particle and the substrate, and steric forces between particlesb. Each force is discussed in the
following sections. This chapter concludes with a description of how the Lennard-Jones force was
used to model the forces between particles.
2.1. Van der Waals Forces
Van der Waals forces acting between hematite particles in hexane are attractive, as are the
Van der Waals forces acting between the hematite nanoparticles and the silicon dioxide substrate.
A general form for both Van der Waals energy and force is provided by Hamaker (1937). Appendix
1 shows a derivation of the form of Hamaker’s equation used in the Fortran algorithm of this study.
The energy between a spherical particle and a flat substrate is given by
𝑉𝑉𝑝𝑠 = −𝐴1321
6{
𝑟
𝑧 − 𝑟+
𝑟
𝑧+𝑟+ 𝑙𝑛
𝑧−𝑟
𝑧+𝑟}, (Energy between particle and substrate) ( 1 )
where A132 is the Hamaker constant between particle and substrate, r is the radius of the particle,
and z is the distance from the substrate to the center of the particle. The force on the particle due
to the substrate can be found by differentiating and is
𝐹𝑉𝑝𝑠 = 𝐴132
6{
1
𝑧−𝑟−
𝑟
(𝑧−𝑟)2−
1
(𝑧 + 𝑟)−
𝑟
(𝑧 + 𝑟)2}. (Force between particle and substrate) ( 2 )
The energy between two spherical particles of the same size is given by
𝑉𝑉𝑝𝑝 = −𝐴1311
6{
2𝑟2
𝔇2− 4𝑟2 + 2𝑟2
𝔇2 + 𝑙𝑛𝔇2− 4𝑟2
𝔇2 } , (Energy between two particles) ( 3 )
b Gravity and Drag forces were also modeled by the molecular dynamics algorithm. Because these forces
are not specific to colloidal systems, they are discussed in Chapter 3.
6
where A131 is the Hamaker constant between two particles, and 𝔇 refers to the distance between the
centers of two particles. By differentiating, we find the force between the two particles to be
𝐹𝑉𝑝𝑝 = −𝐴1311
6{
2𝔇
𝔇2+4𝑟2 − 4𝑟2𝔇
(𝔇2 +4𝑟2)2−
2
𝔇−
4𝑟2
𝔇3 }. (Force between two particles) ( 4 )
In the Lifshitz Theory of Van der Waals forces, Hamaker’s constant A for objects
interacting across a medium is calculated using bulk properties of the materials involved, such as
dielectric constants and refractive indices. (Israelachvili pp. 256 - 258) The value of Hamaker’s
constant between the two spherical hematite particles in hexane solution—denoted A131—differs
from that between a hematite particle and the silicon dioxide substrate in hexane solution—denoted
A132. Values of Hamaker’s constant calculated using the Lifshitz theory can be found in the
literature and are given by (Faure, Salazar-Alvarez and Bergstrom)
𝐴131 = 29 × 10−21 𝐽𝑜𝑢𝑙𝑒𝑠 = 0.18 𝑒𝑉, and ( 5 )
𝐴132 = 4 × 10−21 𝐽𝑜𝑢𝑙𝑒𝑠 = 2.5 × 10−2 𝑒𝑉. ( 6 )
2.2. Steric Forces
While Van der Waals forces attract particles together, steric forces push the particles apart.
Steric forces arise due to the surfactant coating on the particles and serve to stabilize the colloidal
system by preventing the particles from coagulating. As depicted in Figure 2, the surfactant coating
is made up of many polymer strands known as ligands that are attached to the hematite particle
surface. When two polymer-coated particles approach each other, a repulsive force results as the
ligand shells begin to overlap. (Israelachvili p. 387) The steric potential for two spherical particles
can be calculated using
𝑉𝑆𝑝𝑝 = 100𝑟𝐿3
(𝔇−2𝑟)𝜋ℎ3 𝑘𝑇exp (−𝜋(𝔇−2𝑟)
𝐿), ( 7 )
where L is the thickness of the ligand shell, h is the distance between two ligand headgroups on the
surface of the particle, k is Boltzmann’s constant, and T is the temperature of the solution.
7
(Weddemann, Ennen and Regtmeier p. 82) The force between particles caused by the steric
potential can be found by taking the derivative of the steric potential. The result is
𝐹𝑆𝑝𝑝 = − 𝜕𝑉
𝜕𝔇 =
100𝑟𝐿2𝑘𝑇[𝐿+𝜋(𝔇−2𝑟)]
(𝔇−2𝑟)2𝜋ℎ3 exp (−𝜋(𝔇−2𝑟)
𝐿) . ( 8 )
Equations (7) and (8)
demonstrate several
noteworthy features of the
steric potential and force.
First of all, note that when the
distance between centers is
equal to twice the radius of
the nanoparticle—in other
words when the nanoparticles
at the centers of the ligand
shells are touching—the
values of both the potential
and force equations tend to infinity. We would expect, therefore, that the nanoparticles should
never touch, although it is possible for the ligand shells to touch. Note that the force will always
be repulsive, but due to the exponential decay term, the repulsive force is strongest when the ligand
shells are close to each other. The repulsive forces that result when ligand shells approach depend
on the variables L and h. If we assume two particles have a given ligand shell thickness and we fix
their separation distance, we see that higher repulsive forces result for smaller values of h, or for
headgroups that are placed closer together. This makes sense because when h is smaller, there are
more polymer strands that separate the two particles. Similarly, for a given headgroup separation
and particles held fixed at a given distance, we see that higher repulsive forces result for larger
Figure 2. Cross section of two spherical nanoparticles coated in a
polymer ligand shell. When particles approach each other, a repulsive
force results as the ligand shells begin to overlap.
8
values of L, or a thicker ligand shell. Thus, in general, higher repulsive forces result for higher
values of L and lower values of h.
Surfactant coatings can be created with a wide range of values for L and h. In this study, a
ligand thickness of L = 5 nm and a distance between headgroups of h = 5 nm were chosen. In future
studies, values for L and h can be varied to determine the effects of surfactant coatings on settling
time and formation of patterns on the substrate surface, but this study was limited to a single choice
of ligand shell thickness and distance between headgroups in order to study only the role of system
particle number on deposition rate and formation of patterns on the substrate.
2.3. Lennard-Jones Potential
The Lennard-Jones potential (Israelachvili p. 136),
𝑉𝐿𝐽 = 4휀 [ (𝜎
𝔇)12
− (𝜎
𝔇)6 ] ( 9 )
can be used to model the summation of the Van der Waals attractive potential and the steric
repulsive potential between two particles. Here, 𝔇 represents the distance between centers of the
particles, ε represents the magnitude of minimum energy, and σ represents the distance 𝔇 where
the potential is equal to zero.
The force between particles corresponding to the Lennard-Jones potential can be found by
taking the derivative of equation (9), which is
�⃑�𝐿𝐽 = − 𝜕𝑉
𝜕𝔇= �⃗⃗⃗�
24𝜀
𝔇2 (𝜎
𝔇)6 [1 − 2 (
𝜎
𝔇)6 ] . ( 10 )
In equation (10), the force will be negative (repulsive) when 𝔇 is less than 21/6σ, and will
be positive (attractive) where 𝔇 is greater than 21/6σ. For a given particle, the direction in which
the force acts is determined by the vector �⃗⃗⃗� . This can most easily be seen by imagining the one-
dimensional case of a force acting between two particles in the x direction only. Imagine that one
particle is located to the right of another particle, and we wish to consider the direction of the force
9
caused by the rightmost particle on the leftmost particle. In this case, the vector �⃗⃗⃗� will be point to
the right. If the value of the force calculated by equation (10) is repulsive (quantity in brackets
negative), then the force on the leftmost particle acts to the left. In contrast, if the value of the force
calculated by equation (10) is attractive (quantity in brackets positive), then the force on the
leftmost particle acts to the right. In contrast, if we consider the force acting on the rightmost
particle, we see that the vector �⃗⃗⃗� will point to the left, and one can clearly see that a repulsive
interparticle force will act to the right, while an attractive interparticle force will act to the left.
Thus, Newton’s third law is evident when we closely examine the Lennard-Jones force.
The sum of the Van der Waals and steric potentials between particles was plotted in
Mathematica and is shown in Figure 3 (dashed line) for a particle radius r = 10 nm, ligand shell
thickness L = 5 nm, and distance between ligand headgroups h = 5 nm. The magnitude of minimum
energy and the value of 𝔇 where potential was equal to zero were read from the graph. These
values were equated to ε and σ, respectively, to determine the “best fit” Lennard-Jones potential
and are
휀 = 4.976 × 10−23 𝐽𝑜𝑢𝑙𝑒𝑠, ( 11 )
𝜎 = 30.85 × 10−9 𝑚. ( 12 )
Figure 3 compares a plot of the summation of the Van der Waals potential and steric
potential (dashed line) to the “best fit” Lennard-Jones potential (solid line). The value of distance
at zero potential energy and the value of minimum potential energy are the same on the two plots
since these are the points that were matched in the curve fit. However, the distance between particle
centers where the minimum potential occurs differs slightly between the two curves, indicating a
slight difference between where the two potentials will transition between repulsive and attractive
forces. In addition, at distances less than the minimum potential, the curve of the summation of the
Van der Waals and steric potentials is steeper than that of the Lennard-Jones potential. The same
can be said of the slopes between minimum potential and up to a distance of approximately 40 nm.
10
Since the force is proportional to the slope, this indicates that the forces given by the Lennard-Jones
model are slightly less than those of the Van der Waals and Steric forces in these regions. In
particular, if we calculate the forces for the close distance of 21 nm, we note a marked difference
between the magnitude of the Lennard-Jones force, on the order of 10-11 N, and the sum of the Van
der Waals and steric forces, on the order of 10-9 N.c This difference will be important when we
look at the formation of patterns on the substrate in Chapter 4.
The Lennard-Jones potential depicted in Figure 3 was used to model the Van der Waals
and steric potentials between particles in this project. Although the Lennard-Jones model is not
perfect, the force requires fewer computations, which allowed the computer program to run more
quickly, and that in turn allowed more simulations to be completed.
c See Appendix 2 for representative magnitudes of forces applicable to this study.
Figure 3. Comparison of Lennard-Jones potential to sum of Van der Waals and steric potentials. The
particles are 20 nm in diameter and have a 5 nm coating of ligands.
CHAPTER 3
SIMULATION DEVELOPMENT
The Fortran molecular dynamics program was developed using an incremental approach.
Following selection of the core routine and development of the initial algorithm, the various forces
acting on the particles were incorporated one-by-one, and the results were checked to ensure that
the forces had been correctly implemented. At times, subroutines were developed separately so
that specific outputs could be isolated and verified for accuracy. The following sections describe
each of the major decision points in program development, and then present important checks
performed to verify success at each stage of development.
3.1. Molecular Dynamics
A molecular dynamics algorithm was chosen as the core algorithm in this study due to its
ability to model behavior over a specified time period. The Monte Carlo method is another
simulation routine that can be employed to model particle motion in a liquid. One advantage of the
Monte Carlo technique is that it is computationally less intensive, so simulations can be done more
quickly. However, while the Monte Carlo method is useful for studying the equilibrium properties
of a system, it is not well suited for answering questions related to the time evolution of a system.
(Giordano and Nakanishi p. 270) For this study, we wished to simulate the amount of time required
for particles to deposit onto a substrate. Molecular dynamics is more appropriate for investigating
such questions.
In its most basic form, a molecular dynamics algorithm applies Newton’s second law to
each particle in a given system, calculating forces acting on each particle as functions of the
12
positions and velocities of the particles at a given point in time. Then, the acceleration of each
particle is calculated from the forces. In a molecular dynamics routine, time is discretized into a
time step. From the acceleration at one point in time, the position and velocity of a given particle
can be calculated at the next time step. The routine is repeated over a great number of time steps
to model the time evolution of a system.
In more precise mathematical form, the molecular dynamics algorithm is used to solve
�̈⃑�(𝑡) = 1
𝑚�⃑�[�⃑�(𝑡), �̇⃑�(𝑡), 𝑡], ( 13 )
a second order differential equation which may be broken into six coupled first order differential
equations, namely,
�̇⃑�(𝑡) = �⃑�(𝑡), and ( 14 )
�̇⃑�(𝑡) = 1
𝑚�⃑�[�⃑�(𝑡), �⃑�(𝑡), 𝑡]. ( 15 )
In these equations, �⃑� refers to the position, �⃑� the velocity, t the time, m the mass, and �⃑� the force
acting on a particle. Note in equations (13) and (15) that the force �⃑� is represented as a function of
position, velocity, and time. In order to solve the two coupled first order differential equations, a
numerical integration scheme must be chosen whereby the equations are discretized. Many
numerical integration schemes are available, but some are better suited for molecular dynamics
routines. Two desirable qualities for an integration scheme are that it allows selection of a relatively
long time step, and that it conserves energy and be time reversible. (Allen and Tildesley p. 76)
Selection of a relatively long time step allows modeling of a longer period of real time at less cost
in terms of computational resources. In general, we wish to choose the longest time step possible
while still retaining realistic output values for position, velocity, and energy. Appendix 3 provides
more detailed descriptions of the integration methods discussed in the following paragraphs. For
each integration method, at time t = 0 the particles are imparted with some initial positions and
velocities, as described in Section 3.4.
13
The Euler method is one of the simplest integration schemes. Given the positions and
velocities at the current time step n, the positions and velocities at the next time step n+1 are given
by
�⃑�𝑛+1 = �⃑�𝑛 + �⃑�𝑛∆𝑡, and ( 16 )
�⃑�𝑛+1 = �⃑�𝑛 + 1
𝑚�⃑�[�⃑�𝑛, �⃑�𝑛, 𝑡]∆𝑡 = �⃑�𝑛 + �⃑�𝑛∆𝑡. ( 17 )
Here, Δt refers to the time step, while the variable �⃑� represents the acceleration, calculated by
dividing the force by the mass. A disadvantage of the Euler method is that errors accumulate during
each step that are of order (Δt)2, and the final error in our solution, accumulated over all time steps,
is of order Δt. (Giordano and Nakanishi p. 457) Thus, exceedingly small time steps would have
to be chosen in order for the Euler method to yield acceptable output values for energy. However,
since molecular dynamics routines must be executed over a large number of time steps to simulate
the system under study, the Euler routine is not as efficient as other methods.
A method more suited to molecular dynamics routines is the Velocity Verlet/Leapfrog
algorithm (Strobl and Bannerman p. 59), given by
�⃑�𝑛+1 = �⃑�𝑛 + �⃑�𝑛∆𝑡 + �⃑⃗�𝑛
2(∆𝑡)2, ( 18 )
�⃑�𝑛+
1
2
= �⃑�𝑛 + �⃑�𝑛 ∆𝑡
2, and ( 19 )
�⃑�𝑛+1 = �⃑�𝑛+
1
2
+ �⃑⃗�𝑛+1
2∆𝑡. ( 20 )
Note that this method includes a half-time step, denoted by the subscript n+½. After the position
at the next time step and the velocity at the half-time step are calculated, the forces are recalculated
to generate the acceleration at the next time step. From this, the velocity at the next time step can
be found using the half-step velocity and the next time step acceleration.
The Velocity Verlet/Leapfrog algorithm is an improvement to Verlet’s original method
(Verlet) that allows calculation of the velocity at the same time step as the position, which in turn
permits easier calculation of the energies at a given time step. In contrast, the basic Verlet algorithm
14
calls for only position steps to be calculated, using the algorithm (Allen and Tildesley p. 78)
�⃑�𝑛+1 = 2�⃑�𝑛 − �⃑�𝑛−1 + �⃑�𝑛Δ𝑡2. ( 21 )
If velocity is required, it must be calculated from stored values of position, such as
�⃑�𝑛 = 𝑥𝑛+1− 𝑥𝑛−1
2Δ𝑡, ( 22 )
an equation subject to errors two orders of magnitude higher than the equation for positions. (Allen
and Tildesley p. 78). The leapfrog algorithm was proposed to calculate velocities at every half-
step, with errors of the same order of magnitude as the positions, and may be employed using (Allen
and Tildesley p. 80)
�⃑�𝑛+1 = �⃑�𝑛 + �⃑�𝑛+
1
2
Δ𝑡, and ( 23 )
�⃑�𝑛+
1
2
= �⃑�𝑛−
1
2
+ �⃑�𝑛Δ𝑡. ( 24 )
The leapfrog algorithm is so named because we “leap over” the coordinates when we calculate the
next value of velocity at the half time step. One minor drawback to the leapfrog method is that if
we wish to calculate kinetic energy at an integer value of time step, we must perform the additional
calculation
�⃑�𝑛 =1
2(�⃑�
𝑛+1
2
+ �⃑�𝑛−
1
2
). ( 25 )
A benefit of the Velocity Verlet/Leapfrog algorithm is that positions and velocities are both
calculated at integer values of time step. The Velocity Verlet/Leapfrog algorithm was used early
in this project when only Lennard-Jones forces were acting between particles. Energy was
conserved and animated plots of the particles showed that they behaved as expected under the
influence of a Lennard-Jones force. Specifically, particles appeared to be repelled from each other
when they were within the value of 21/6σ, but attracted to each other from larger distances.
Unfortunately, the Velocity Verlet/Leapfrog algorithm in the form given by equations (18), (19),
and (20) is not well-suited to a system where drag and fluctuating forces are acting. In this case,
some forces are functions of velocity, and we cannot calculate these velocity-dependent forces (and
15
thus cannot calculate accelerations) at the new time step using the half-step velocity—rather, the
new time step velocity, which is unknown, would be required to calculate the velocity-dependent
forces. Thus, an alternative leapfrog method developed by Van Gunsteren and Berendsen was used
to incorporate friction and fluctuating forces into the algorithm. This method is discussed in detail
in Appendix 3 and is summarized later in this chapter. First, we take a brief interlude into boundary
conditions, random number generation, and initial conditions, as well as a description of the
Langevin equation.
3.2. Periodic Boundary Conditions
The number of particles simulated in a colloidal system may be practically limited by
considerations such as the computer processor speed and the time required to run a simulation. For
example, in this study, the largest colloidal system studied consisted of 100 particles, and it took
almost a full day to run a simulation on a laptop computer.
Since resources limit the number of particles we can simulate, we should choose a
relatively small volume to contain those particles so that they can interact with one another. In this
simulation, the 20 nm diameter particles were contained within a cubic box with 300 nm side
lengths. One problem with such a small box is that the particles will hit the walls of the box
frequently, so surface effects—such as rebounding off the walls of the box—will come into play.
These surface effects will affect the results of the simulation. In addition, if we want to achieve a
statistically significant outcome then we should study a system of infinite size.
Although resources may limit the size of the system simulated, periodic boundary
conditions may be employed to extend the results of a simulation to an infinite system. (Allen and
Tildesley pp. 24 - 27) To employ periodic boundary conditions, we imagine an infinite number of
identical boxes lined up in all directions next to the box under study. Figure 4 illustrates a two-
dimensional representation of such periodic boundary conditions by using nine boxes. The active
16
box—or, the box we
simulate using molecular
dynamics—is in the center,
and the eight boxes
surrounding it represent
eight of the image boxes.
Each box contains the same
number of particles, located
in equivalent locations and
with the same velocities
within their respective
boxes. In the active box,
when a particle crosses a
boundary of the box on one
side, then a particle will also
cross on the opposite side. For example, as depicted in Figure 4, if a particle exits the box on the
right, a particle will also enter the box from the adjacent box to the left. Thus, any time a particle
enters or exits one side of the box, a corresponding particle will exit or enter the box from a
corresponding position on the opposite side. These so-called periodic boundary conditions allow
us to simulate an infinite system by modeling only one box in the infinite series of boxes. For a
fluid subjected to Lennard-Jones forces, a cubic box of size 6σ should be large enough that a given
particle cannot sense its own images in adjacent boxes. (Allen and Tildesley p. 25) Recall that σ
is a parameter used in the Lennard-Jones force and is equal to about 30 nm for this study.
When using periodic boundary conditions, the Lennard-Jones force and potential between
one particle and another should be calculated only between the closest images. Thus, if we consider
a particle on the lower left side of the active box and would like to know the potential generated
Figure 4. Illustration of two dimensional periodic boundary conditions.
Eight image boxes surround the active box in the center. As a particle
leaves one side of the active box—for example, the right—another
particle enters from the opposite side. In calculating forces between
particles, the force should be calculated using the closest image, which
may not be in the active box.
17
between this particle and a particle at the upper right of the simulation box, then we must consider
the potential between that particle and the closest image particle, as depicted in Figure 4.
For the colloidal system studied in this project, we placed a substrate at z = 0. Thus,
periodic boundary conditions were implemented only in the x and y directions. In the vertical
direction, once a given particle reached the substrate, the value of z was held constant. In addition,
particles were initially placed no higher than 50 nm below the top of the box. However, if random
forces or interparticle forces caused the particle to rise above the top of the box, then the particle
height was readjusted so that it was at the top of the box. Figure 5 illustrates periodic boundary
conditions with a substrate simulated at z = 0.
3.3. Random Number Generation.
Production of random numbers is vital to the success of a stochastic dynamics algorithm.
True random number generators must rely upon some unpredictable physical process, such as
rolling dice or flipping coins, to produce random numbers. (Katzgraber) However, such processes
are inconvenient for computer algorithms that must produce a large number of random numbers in
a short period of time. Thus, most computer simulations rely upon pseudo random number
generators, which are described in some detail in Appendix 4.
Figure 5. Periodic boundary conditions with a substrate at z = 0. When a
particle hits the substrate, the z value is fixed. Particles can climb no
higher than z = 300 nm.
18
This project required both uniform random numbers falling on the interval from 0 to 1, and
random numbers falling on a Gaussian distribution of zero mean and some specified standard
deviation. Uniform random numbers were used in assigning initial positions and velocities to
particles in those cases where the initial conditions were assigned randomly. The uniform random
numbers were also required in the routine used to produce Gaussian random numbers. Gaussian
random numbers were then used to generate values for the random fluctuating force, described in
Section 3.5.
The pseudo random number generator was initialized using a negative integer as a random
seed. In pseudo random number generators, when the same initializing seed is used, the same
sequence of “random” numbers is produced. Thus, the same seed was only used while debugging
the software algorithm. For the simulations described in Chapter 4, different random seeds were
used for each simulation run to ensure statistically significant results could be attained.
3.4. Initial Conditions
Prior to initiating a molecular dynamics simulation, the particles must be imparted with
some initial positions and velocities. Initial positions may be assigned randomly, or they may be
assigned in an ordered pattern. Random initial positions were used for the results reported in this
chapter. In assigning initial positions, an algorithm was implemented to ensure that particles were
not so close that unrealistically large forces resulted. Specifically, random initial positions were
reassigned if particle centers were closer than the value of σ used in the Lennard-Jones force, which
could result in extremely large repulsive forces. For the results reported in chapter 4, particles were
assigned to an ordered array of initial positions, which is described thoroughly in the next chapter.
Initial speeds were imparted randomly to the particles in each of the three dimensions and
varied between + 1 m/sec, which is close to the root mean square velocity that would be attained
applying the equipartition theorem to the three translational degrees of freedom of the system.
19
When the stochastic dynamics algorithm described later in this chapter was implemented for
fluctuating and viscous forces, it was found that the velocities reached equilibrium values in
agreement with the equipartition theorem within a time step, so these initial velocities were quite
reasonable.
3.5. Langevin Equation
Because the nanoparticles were interacting through a fluid at finite temperature, viscous
forces and fluctuating forces had to be taken into account. Both forces arise from impacts with the
molecules of the fluid and can be described using the Langevin Equation. (Lemons and Gythiel)
The fluctuating forces are present even when the system has reached thermal equilibrium, and result
from random thermal motion of the fluid molecules buffeting the colloidal particles. The drag force
can be understood by imagining that some external force—for example, electromagnetic or
gravitational—is applied to the particles. Then, the particles will tend to move in a given direction
due to this external force, but motion will be impeded in that direction due to impacts with the
molecules of the fluid. Thus, the drag force is proportional to the velocity. (Kubo)
The Langevin equation for a particle acted upon only by viscous and fluctuating forces is
(Kubo)
𝑚�̇⃑�(𝑡) = −𝑚𝛾�⃑� + �⃑⃗�(𝑡), ( 26 )
where the first term on the right-hand side represents the viscous or drag force that is linear in
velocity, and the second term R(t) represents the fluctuating force. The value of the drag coefficient
can be found from Stoke’s formula (Pathria and Beale p. 593),
𝑚𝛾 = 6𝜋𝜇𝓇, ( 27 )
where μ is the viscosity of the fluid and 𝓇 is the hydrodynamic radius of the particle.
20
The random force is usually assumed to fall on a random Gaussian distribution, satisfying
the conditions (Kubo)
⟨�⃑⃗�(𝑡)⟩ = 0, and ( 28 )
⟨�⃑⃗�(𝑡)�⃑⃗�(𝑡 + 𝜏)⟩ = 𝑔(𝜏), ( 29 )
where g(τ) is the autocorrelation function of the random force. The autocorrelation function is an
even function of τ that decreases over a characteristic time called the correlation time. The
autocorrelation function is related to the diffusion constant D through an integration over all time
(Pottier p. 237)
∫ 𝑔(𝜏)𝑑𝜏∞
−∞= 2𝐷𝑚2. ( 30 )
The correlation time is of the same order of magnitude as the time period between collisions of
fluid molecules with the colloidal particles. Assuming the correlation time is short compared to
other characteristic times of the system, such as the time scale on which Brownian motion occurs,
the autocorrelation function can be represented by a delta function 𝛿(𝜏), according to
𝑔(𝜏) = 2𝐷𝑚2𝛿(𝜏). ( 31 )
In addition, Kubo has shown that the diffusion constant is related to the viscosity of a fluid through
(Kubo)
𝐷 = 𝑘𝑇𝛾
𝑚, ( 32 )
where k is Boltzmann’s constant and T is the temperature of the system.
Substituting equations (31) and (32) into equation (29), we find
⟨�⃑⃗�(𝑡)�⃑⃗�(𝑡 + 𝜏)⟩ = 2𝑚𝛾𝑘𝑇𝛿(𝜏) , ( 33 )
an alternative expression for the correlation of the random force. Equation (33) tells us that the
random forces at two different times are uncorrelated. Since the average value of the random force
is zero, we can relate this function to the variance of the random force σR as
𝜎𝑅2 = ⟨�⃑⃗�2⟩ − ⟨�⃑⃗�⟩2 = ⟨�⃑⃗�2⟩ − 0 = ⟨�⃑⃗�(𝑡)�⃑⃗�(𝑡 + 𝜏)⟩ = 2𝑚𝛾𝑘𝑇𝛿(𝜏). ( 34 )
21
Equation (34) relates the variance of the random force to the delta function, an infinitely
high function of infinitesimal width. Whereas the delta function can be integrated over a continuous
integral as
∫ 𝛿(𝜏)𝑑𝜏 = 1,∞
−∞ ( 35 )
a molecular dynamics routine requires a finite element version of the delta function. As described
in Section 3.1, numerical integration involves breaking an integral into time steps of finite but
extremely small duration. Here, we wish to discretize the delta function such that its integral still
encloses an area of one. We can do so by estimating the delta function with a step function that is
of width Δt and of height 1/Δt, as depicted in Figure (6). Thus, the variance used for the random
force in a molecular dynamics algorithm, which uses numerical integration, is given by
𝜎𝑅2 =
2𝑚𝛾𝑘𝑇
Δ𝑡, ( 36 )
where mγ is given by Stoke’s
formula, equation (27). Since
we know the mean of the
random force is zero and the
variance is given by equation
(36), we can select values of the
random force at each time step
in a molecular dynamics
algorithm by sampling from a
Gaussian distribution—or by
generating random numbers on
a Gaussian distribution—as
described in Appendix 4.
Figure 6. A step function is used to estimate the delta function in the
numerical integration routine used in molecular dynamics. Here, the
delta function is depicted as an infinitely high arrow of infinitesimal
width. The step function is of width equal to the time step and height
equal to the inverse of the time step. The time step in this diagram is
equal to 0.1 ns.
22
3.6. Incorporating the Langevin Equation into a Molecular Dynamics Routine
Modeling the specific dynamics of the liquid solvent molecules in a colloidal solution
would be computationally intensive, requiring simulation of a large number of molecules acting
over extremely short time steps, since collisions between liquid molecules take place on a much
shorter time scale than that of Brownian motion. Fortunately, we do not need to know the specific
motion of the solvent molecules, but can account for the effects of their motion by incorporating
the viscous and fluctuating forces from Langevin’s equation into Newton’s second law for the
colloidal solute particles, and then solving that equation numerically. (Van Gunsteren and
Berendsen) Thus, for each particle, we must solve the coupled equations
�̇⃑�(𝑡) = �⃑�(𝑡), and ( 37 )
𝑚�̇⃑�(𝑡) = �⃑�[�⃑�(𝑡)] − 𝑚𝛾�⃑� + �⃑⃗�(𝑡), ( 38 )
where �⃑� is the system force on the particle due to various interactions, such as the Lennard-Jones
interaction between particles, or gravity acting in the vertical direction.
An algorithm developed by Van Gunsteren and Berendsen (Van Gunsteren and Berendsen),
described in detail in Appendix 3, was used to numerically integrate equations (37) and (38). The
algorithm is similar to the leapfrog algorithm presented as equations (23) and (24) in that position
is updated at each integer value of time step, whereas velocity is updated at half-step values.
Specifically, to update position and velocity, we use
�⃑�𝑛+1 = �⃑�𝑛 + �⃑�𝑛+
1
2
Δ𝑡
(𝛾Δ𝑡)[exp (+
𝛾𝛥𝑡
2) − exp (−
𝛾Δ𝑡
2)] + �⃑�
𝑛+1
2
(Δ𝑡
2) − �⃑�
𝑛+1
2
(−Δ𝑡
2) +
𝑂[(Δ𝑡)3], and ( 39 )
�⃑�𝑛+
1
2
= �⃑�𝑛−
1
2
exp(−𝛾𝛥𝑡) + 𝐹𝑛⃗⃗ ⃗⃗ ⃑
𝑚(𝛾Δ𝑡) Δ𝑡 [1 − exp(−𝛾Δ𝑡)] + �⃑⃗�𝑛 (
Δ𝑡
2) −
exp(−𝛾𝛥𝑡) �⃑⃗�𝑛 (−Δ𝑡
2) + 𝑂[(Δ𝑡)3], ( 40 )
where γ is calculated using equation (27), and where �⃑�𝑛+
1
2
(Δ𝑡
2) , �⃑�
𝑛+1
2
(−Δ𝑡
2) , �⃑⃗�𝑛 (
Δ𝑡
2) , and
23
�⃑⃗�𝑛 (−Δ𝑡
2) each represent different integrals of the random force �⃑⃗� (t)—multiplied by various
quantities—evaluated over certain integrals of time. The random force integrals are evaluated by
sampling Gaussian random numbers from distributions of zero mean and specified width, as
described in detail in Appendix 3.
Equations (39) and (40) are similar in form to the equations for the leapfrog algorithm in
equations (23) and (24). In fact, in the limit of infinitesimal friction coefficient γ, the Van
Gunsteren/Berendsen method reduces to the leapfrog algorithm. This can be verified by
substituting series expansions for the exponential terms into equations (39) and (40) and then
simplifying the equations. Also like the leapfrog algorithm, note that the errors in position and
velocity for each time step are of order (Δt)3. In general, algorithms of even higher order would be
impractical for stochastic dynamics routines since the gains made in accuracy due to the higher
order algorithm would be offset due to the uncertainties arising from the action of the random force
R(t). (Van Gunsteren and Berendsen) On the other hand, we have seen that lower order algorithms
such as the Euler routine are not efficient for molecular dynamics simulations. Thus, the Van
Gunsteren/Berendsen algorithm presents an appropriate method for modeling the colloidal system.
After incorporating the Van Gunsteren/Berendsen algorithm into the Fortran simulation
program, several tests were performed to ensure that the method produced reasonable results.
Table 1 provides the properties of the nanoparticle system used for these checks, which are
described in the remainder of this section.
3.6.1. Determination of Best Time Step
When initially implementing the Van Gunsteren/Berendsen algorithm, the optimum time
step had to be determined. As mentioned previously, a larger time step allows simulation of a
larger period of real time over a shorter period of computational time. However, if the time step
is too large, the algorithm will provide unrealistic values for position, velocity, and energy. Thus,
time step was varied from 1 x 10-15 to 1 x 10-8 seconds during separate simulation runs for a system
24
Table 1. Physical properties of nanoparticle system.
Physical Property Value
Density of Magnetite1 5175 kg/m3
Viscosity of Blood2 3.0 x 10-3 Pa-s
Radius of Hematite Nanoparticle 10 nm
Hydrodynamic Radius3 10 nm
Temperature (Human Body Temperature) 310K
kT4 4.28 x 10-21 J
Lennard-Jones Force
Parameters
ε 1.00 x 10-21 J
σ 30.0 nm 1 http://www.mindat.org/min-2538.html (Magnetite) 2 http://www.engineeringtoolbox.com (Dynamic Viscosity of Some Common Liquids) 3 Assumes no ligand shell attached. 4 Boltzmann’s constant times temperature
of 10 particles and a real time period of 10 million ns, or 10 ms, and output parameters for each
data run were compared. The Lennard-Jones force was not active during these data runs, so the
only forces acting on the particles were viscous and fluctuating forces. Output parameters included
average kinetic energy of the system, as well as positions of all the particles. The average kinetic
energy was compared to the equipartition theorem. For a system which has three translational
degrees of freedom, like the one under study, the equipartition theorem says that the average kinetic
energy K is
⟨𝐾⟩ = 3
2𝑁𝑘𝑇, ( 41 )
where N refers to the number of particles simulated in the box, k is Boltzmann’s constant, and T is
the system temperature.
Average values of kinetic energy matched well with the equipartition theorem for all trial
values of time step. However, for time steps of 1 x 10-9 and 1 x 10-8 seconds, the values for position
eventually blew up to excessively large numbers, indicating that these time steps were too large to
be used to simulate the system. Ultimately, the best choice of time step was found to be 1 x 10-10
seconds, since it gave energies consistent with the equipartition theorem, but values for position
did not grow excessively over time.
25
3.6.2. Simulation Compared to Equipartition Theorem
After determining the optimum time step, the temperature of the system was varied and the
average kinetic energy compared to the equipartition theorem. No system forces were acting on
the particles. Results appear in Table 2 and are in excellent agreement with the equipartition
theorem. For example, simulations at 310K differ from the expected equipartition value by less
than 0.1%.
Table 2. Average kinetic energy compared to equipartition theorem at four temperatures.
Temperature
(K)
Average Kinetic Energy Over
Time (Joules)
Percent Difference
Between Simulation and
Equipartition Theorem
Duration of
data run (nsec)
Equipartition
Theorem
Simulation2
0 0 0 0% 1 million
150 3.107 x 10-20 3.117 x 10-20 0.348% 1,000
310 6.420 x 10-20 6.414 x 10-20 0.0918% 1 million
450 9.320 x 10-20 9.320 x 10-20 0.00193% 10,000 1 Simulations were all run for 10 particles, using time steps of 1 x 10-10 sec. 2 Average kinetic energy for the simulation was found by averaging the kinetic energy for all 10 particles over all time steps where data
was recorded. No system forces were acting on the particles.
3.6.3. Random Walk Motion
If the movement generated by the Van Gunsteren/Berendsen routine is truly random, then
the motion of the particles under the influence of solely the viscous and fluctuating forces (i.e. no
system forces such as Lennard-Jones forces) should follow a “random walk.” Two methods were
devised to check the random motion of the system particles. First, the mean square displacement
of the particles was calculated each time that data snapshots were taken. Diffusion coefficient can
be calculated using both the mean square displacement and the physical properties of the system.
Agreement between these two calculation methods would indicate that the algorithm is operating
correctly. Secondly, the motion of a single particle acted upon by viscous and fluctuating forces
was plotted in 3 dimensions.
26
For spherical particles, the Diffusion coefficient can be calculated by using Einstein’s
relation (Pathria and Beale p. 595)
𝐷 =𝑘𝑇
6𝜋𝜇𝓇=
(1.3807 𝑥 10−23)(310𝐾)
6𝜋(3 𝑥 10−3)(10 𝑥 10−9)= 7.569 x 10−12
m2
𝑠 ( 42 )
where k is Boltzmann’s constant, T is the temperature of the system, μ is the viscosity of the fluid,
and 𝓇 is the hydrodynamic radius of the particle. Substituting values for these quantities, the
diffusion coefficient for the nanoparticle system is found to be 7.569 x 10-12 m2/s.
In three dimensions, the relationship between the diffusion coefficient D and the mean
square displacement ⟨𝑟𝑁2⟩ is given by (Pathria and Beale p. 593)
⟨𝑟𝑁2⟩ = 6𝐷𝑡, ( 43 )
or, solving for D,
𝐷 = ⟨𝑟𝑁
2⟩
6𝑡, ( 44 )
where t represents the time. Mean square displacement for N particles at a specific time t can be
calculated using
⟨𝑟𝑁2⟩ =
∑ (𝑥𝑖(𝑡)−𝑥𝑖(0))2+(𝑦𝑖(𝑡)−𝑦𝑖(0))
2+(𝑧𝑖(𝑡)−𝑧𝑖(0))
2𝑁𝑖=1
𝑁, ( 45 )
where xi(t), yi(t), and zi(t) represent the total displacement of the particles at time t, while xi(0), yi(0),
and zi(0) represent the starting positions of the particles.
The Van Gunsteren/Berendsen algorithm was tested by simulating a system of 10 particles
over a time period of 10 million ns (10 ms), or 100,000,000 cycles, with data taken every 10,000
cycles. Figure 7 shows a plot of the variation in mean square displacement over time. A linear
curve fit to the data, found using Mathematica, is given by
⟨𝑟𝑁2⟩ = 0.0478𝑡 − 0.0126. ( 46 )
The curve fit is good with an R-squared value of 0.9743. Since the slope of this curve is ⟨𝑟𝑁2⟩/𝑡,
we can divide the slope by six to find a value of diffusion coefficient of D = 7.964 x 10-12 m2/s,
which differs from the value calculated using Einstein’s relation by 5.09%.
27
The algorithm also calculated values of diffusion coefficient using equation (44) each time
a data snapshot was taken.
Averaging these values of
diffusion coefficient over all
snapshots, we find an average
value of D = 7.442 x 10-12
m2/s, which differs from the
Einstein relation value by
1.69%. The agreement of the
diffusion coefficient
calculated from data generated
by the Van
Figure 7. Mean square displacement for a 10 particle system acted upon by viscous and fluctuating forces.
Figure 8. Random walk movement of one particle over time due to
viscous and fluctuating forces. Data taken over 100,000 ns in 10 ns
intervals.
28
Gunsteren/Berendsen routine and the Einstein relation indicates that the algorithm is working
correctly.
The second method used to determine whether particles simulated using the Van
Gunsteren/Berendsen algorithm exhibited random walk behavior was to plot the motion of a single
particle as modeled by the algorithm. Figures (8) and (9) show 10,000 representative points of
motion of two separate particles acted upon solely by viscous and fluctuating forces. In Figure (8),
data snapshots were taken every 10 ns for a total of 100,000 ns, while in Figure (9) snapshots were
taken every 100 ns for a total
of 1 million ns. In both plots,
the motion appears to
fluctuate within the box,
rather than following some
straight path. In some
locations of Figure (8), we
can see where the periodic
boundary conditions have
brought the particle from one
side of the box (bottom) to the
other (top). Although data
points in Figure (9) are much
further apart, we can clearly
see that the particle moves
throughout the entire box.
Figure 9. Random walk movement of one particle over time due to
viscous and fluctuating forces. Data taken over 1 million ns in 100 ns
intervals.
29
3.7. Euler Method Used for Stochastic Dynamics
For comparison, an Euler algorithm, using the Euler integration scheme given by equations
(16) and (17), was developed and applied to the colloidal system under study. The acceleration in
equation (17) can be calculated using
�⃑�𝑛 = 1
𝑚 [ �⃑�𝑛(𝑥𝑛) − 𝑚𝛾�⃑�𝑛 + �⃑⃗�𝑛 ], ( 47 )
where �⃑� represents system forces such as the Lennard-Jones force, γ is calculated using equation
(27), and �⃑⃗� is the random fluctuating force, determined by generating a random Gaussian number
from a distribution of zero mean and width σR, with σR given by equation (36).
A time step of 1 x 10-12 sec was required to attain acceptable output values of position,
velocity, and energy using the Euler routine. Thus, if we consider the time step alone, it would take
approximately 100 times longer to simulate a colloidal system over a given real time period using
the Euler routine in place of the Van Gunsteren/Berendsen algorithm.d For this project, a trial
simulation was conducted for a system of 10 particles and a time period of 10,000 ns (10 million
cycles), with data snapshots taken every ns (or every 1,000 cycles). Average kinetic energy for all
particles over time was 6.5 x 10-20 Joules, differing by about 1.2% from the expected equipartition
value of 6.42 x 10-20 Joules. A glance at Table 2 will verify that the Van Gunsteren/Berendsen
algorithm produces results more in line with the expected equipartition values, with a percent
difference less than 0.1% at 310K.
Although the Euler routine is a simple method that could be used to model a colloidal
system, the accompanying larger computation times and lower accuracy make it much less
desirable than the Van Gunsteren/Berendsen algorithm for modeling colloidal systems.
d Actually, since the Euler routine is simpler than the Van Gunsteren/Berendsen algorithm, each loop through
the Euler routine will be slightly faster than each loop through the Van Gunsteren/Berendsen algorithm.
However, the computation efficiency gains due to simplicity of the algorithm are not enough to make up for
the additional computation time required due to the smaller time step.
30
3.8. Effects of Gravity on Colloidal Particles
After the Van Gunsteren/Berendsen algorithm was successfully implemented, one
additional modification was made before using the program to simulate deposition of hematite
nanoparticles onto a substrate. Namely, the force of gravity was added to the program. Gravity
was implemented as a system force �⃑� acting in only the z direction. The force was added to the
Lennard-Jones force in the z direction and was calculated using
�⃑�𝐺 = 𝑚�⃑�, ( 48 )
where g = 9.81 m/s2 is the acceleration due to gravity.
The systems studied in this chapter consisted of magnetite nanoparticles dispersed in blood,
while the systems studied in chapter 4 consisted of hematite nanoparticles in hexane. The
gravitational force acting on magnetite nanoparticles was 2.13 x 10-19 N, while that for hematite
nanoparticles was 2.16 x 10-19 N.e The standard deviation of the random force for magnetite in
blood was 3.81 x 10-10 N, while that for hematite in hexane was 8.31 x 10-11 N. The mean of the
random force is zero, and we can expect the force to fluctuate quite a bit, but the standard deviation
gives us an idea of a typical order of magnitude for the random force. At times, the magnitude of
the random force will be much greater than that of gravity. At times it will act in concert with
gravity, and at times in opposition. Since the gravitational force acts only in the negative z direction,
we can expect the particles to gradually settle onto the substrate. However, we can also expect that
the particles will be buffeted about by the random fluctuating force, so that their descent to the
substrate will not follow a perfectly smooth curve.
To verify that the gravitational force works as expected, the Van Gunsteren/Berendsen
routine was executed for a system of 100 nanoparticles over a time period of 1 million ns, or 1 ms
(10 million cycles), with data snapshots taken every 1,000 cycles. The program was set up with
periodic boundary conditions eliminated in the z direction to simulate a substrate, and physical
e These calculated forces assume a particle radius of 10 nm.
31
parameters used included density of hematite (to calculate particle mass) and viscosity of hexane
(to calculate viscous/fluctuating forces). The Lennard-Jones force did not act between particles.
As the program was initiated, particles were imparted with random positions and velocities.
Particles were considered to have reached the substrate at the value z = 15 nm, equal to the
hydrodynamic radius of the particlef.
Figure 10 depicts the average height of all particles in this system versus time. As expected,
the particles gradually approach the substrate due to the action of gravity, but average height above
the substrate fluctuates due to the random force. Output data show that all particles had reached
the substrate after 467 μs. The Mathematica “FindFit” function was used to exponentially curve
fit the data. Note that the coefficient in front of t in the exponent is in units of μs-1 and is the inverse
of the time constant.
f Note that z refers to the position of the center of the particle, so the bottom edge of the particle is on the
substrate when z = 15 nm.
Figure 10. Decrease in zaverage for all particles over time for a system of 100
particles acted upon by gravity and viscous and fluctuating forces.
CHAPTER 4
APPLICATION OF MOLECULAR DYNAMICS SIMULATION TO HEMATITE
NANOPARTICLE DEPOSITION ONTO A SUBSTRATE
The molecular dynamics algorithm described in the previous chapter was applied to
hematite nanoparticle deposition onto a silicon dioxide substrate. Deposition times and substrate
deposition patterns for systems with various numbers of particles were recorded and analyzed. This
chapter describes the procedures, analysis, results, and conclusions of this application. The
simulation algorithms used in this study can be found in Appendix 5.
4.1. Introduction
Prior to conducting the hematite nanoparticle simulations, the molecular dynamics
algorithm was adjusted slightly for the specific system under study. As with the investigation of
gravitational force in the previous chapter, periodic boundary conditions in the z direction were
modified to simulate a solid substrate at z = 0. In addition to gravity, a Van der Waals force between
each particle and the substrate, given by equation (2), was added acting in the z direction. The
Lennard-Jones potential was adjusted to match as closely as possible the Van der Waals and steric
interparticle forces described in chapter 1. A variable L was added to the program to represent the
ligand shell thickness. The hydrodynamic radius in the program was represented by the sum of the
radius of the hematite nanoparticle plus the ligand shell thickness, as shown in Table 3.
Hydrodynamic radius was used both to calculate the friction with Stoke’s formula, and in
determining when the particles had reached the substrate. After a particle’s height above the
substrate reached a value less than or equal to 15 nm, the hydrodynamic radius, the particle was
33
considered to have hit the substrate, and the height of the particle above the substrate was held fixed
at a value of 15 nm. Finally, the density of hematite and viscosity of hexane, as reported in Table
3, were used to calculate variables in the program such as mass and friction coefficient.
Table 3. Physical properties of nanoparticle system.
Physical Property Value
Density of Hematite1 5255 kg/m3
Viscosity of Hexane2 2.97 x 10-4 Pa-s
Radius of Hematite Nanoparticle 10 nm
Hydrodynamic Radius 15 nm
Temperature 298K
kT3 4.11 x 10-21 J
Lennard-Jones Force
Parameters
ε 4.976 x 10-23 J
σ 30.85 nm 1 http://www.midat.org/min-1856.html (Hematite) 2 http://www.engineeringtoolbox.com (Dynamic Viscosity of Some Common Liquids) 3 Boltzmann’s constant times temperature
Below we will present results of deposition times, deposition rates, and pattern formation.
4.2. Deposition Time
One goal of this study was to determine whether the number of particles in a system
influences particle deposition time or rate onto a substrate. To minimize the influence of initial
positions on deposition rate, particles were initially placed within an ordered array as depicted in
Figure 11 for 80 particles.g The x and y values for the initial positions were spaced 50 nm apart at
a height above the substrate of 150, 200, or 250 nm. No matter how many particles were in the
system, approximately one-third of all particles were placed at each of the three heights above the
substrate. The reason for this placement is that particles closer to the substrate should theoretically
hit the substrate before particles further away, both because they have less distance to travel and
because the substrate-to-particle Van der Waals force is stronger. If initial positions had been
g Figures depicting initial positions for systems with 20 and 50 particles are provided in Appendix 6.
34
randomly assigned instead, a system that had a larger percentage of particles closer to the surface
could have been predisposed to producing an unrealistically short particle deposition rate. More
importantly, it would have been difficult to compare different simulations with the same number
of particles if each had started with a different distribution of particles above the substrate surface.
A particle spacing of
approximately 50 nm between centers
in all three dimensions was chosen to
ensure that particles were far enough
apart that Lennard-Jones forces
between particles were not excessive.
Thus, at high particle densities,
particles had to be placed in three
vertical layers. Although systems
with fewer particles could have
allowed placement in fewer layers, the
best way to ensure that particle height
did not bias the results was to ensure
that an approximately equal percentage of particles was placed in each of the three vertical layers,
no matter how many particles comprised the system.
Particle deposition times and rates were analyzed for systems with 20, 50, and 80 particles.
For each system, 30 simulations were conducted, where deposition time for all particles was
recorded. After the particles reached the substrate, the z position was held fixed, but the x and y
positions were allowed to vary due to random fluctuations and interparticle forces. In other words,
particles were stuck to the surface after striking but were able to diffuse in two dimensions on the
substrate. For each simulation run, average settling time for all particles, standard deviation of the
settling times, and times for the first and last particles to hit the substrate were tabulated. Next, the
Figure 11. Initial positions for 80 particles. The particles are
shown by balls and the colors are a guide to the eye to
demonstrate the various heights in the z direction.
35
mean deposition time of all data runs at each particle density (the mean of the means), along with
the standard error of the means, were calculated. From this information, the confidence intervals
for mean deposition time in systems with 20, 50, and 80 particles could be determined.
The results are shown
in Figure 12, where the mean
of the mean deposition or
settling time is plotted as a
function of the number of
particles h . The trend is that
higher numbers of particles in
the system result in higher
average times for all particles
to hit the substrate. We can
also see that the standard error is larger for systems with fewer particles.
Some analytical calculations will point to the major factors at work in producing these
results. First of all, we can use Newton’s second law to calculate the time required for a single
particle at zero initial velocity to fall to the substrate when acted upon only by gravity. By
calculating this value for heights above the substrate of 250 nm, 200 nm, and 150 nm, and then
averaging the results, we find a fall time of 193 μs. We can use the leapfrog numerical integration
scheme to calculate the fall time for a particle acted upon by both gravity and the Van der Waals
substrate force. Averaging the results for all three heights above the substrate, we find a fall time
of 47.2 μs. Since the mean fall times shown in Figure 12 are all less than the fall time of gravity
acting alone, we can deduce that both gravity and the Van der Waals substrate force play significant
roles in particle deposition. The fact that the mean times are greater than that found when both
h Some of the raw data used to generate the Figures in this section can be found in Appendix 7.
Figure 12. Difference in particle mean deposition time for systems with
20, 50, and 80 particles. Mean deposition times are written in text on
the figure. Error bars denote standard errors.
36
gravity and the Van der Waals
force act on the particles
indicates the interparticle
forces affect deposition time.
To understand the
effects of interparticle forces on
deposition time, we must
consider the space available on
the substrate and how many
particles will fit on the substrate
surface. If we try to cram too
many particles on the substrate,
they will not all fit, and mean
deposition time for all particles goes to infinity! The diameter of the hematite nanoparticle plus the
ligand shell coating is 30 nm. Thus, we can fit 10 particles across one row that spans the entire
length of the 300 nm long substrate. If we stagger the rows, we find that 115.47 particles fit on the
300 nm square substrate, as depicted in Figure 13.
When fewer particles are on the surface, we can calculate the percent coverage of the
substrate by looking at the ratio of the cross sectional area of all the particles on the substrate to the
surface area of the substrate itself, as depicted in Figure 14 for 20 particlesi.
We can surmise that as the number of particles on the substrate increases, the opportunities
for interparticle interactions to affect substrate deposition will increase. In fact, in systems with
large numbers of particles, we can deduce that these interparticle interactions on the substrate will
influence the average time for all particles to reach the substrate. As progressively more particles
i Similar figures for 50 and 80 particles appear in Appendix 6.
Figure 13. Maximum number of particles that fit on square substrate
when all ligand shells are touching. Circles represent diameter of
particle with ligand shell.
37
are attached to the substrate,
interparticle interactions will
affect deposition of additional
particles more and more. We
can imagine that falling
particles will be attracted to
particles already on the
substrate via the Lennard-
Jones force when the particle
center-center distance is
beyond 21/6σ (≈34.6 nm), but
that these same particles will
become repelled at distances
less than 21/6σ. Thus, whether or not a given particle is deposited onto the surface is determined by
a vector summation of several competing forces: interparticle Lennard-Jones force; Van der Waals
substrate force; fluctuating forces, and gravity.
The interparticle Lennard-Jones forces will gradually come to play a more important role
in deposition rate as the number of particles in a system increases. Whereas with 20 particles the
percent coverage is 15.7%, with 50 particles it is 39.3%, and with 80 particles, it rises to 62.8%,
taking up over half of the area on the substrate surface! If we further consider the fact that the
particles experience a repulsive force within a center-center distance of 34.6 nm, we can understand
that in systems with very high particle numbers, most available configurations will be such that
particles are repelled by the other particles that are closest to them. We can visualize this most
easily by looking at Figure (15), a diagram where circles are sized at 34.6 nm, the distance where
the Lennard-Jones force of the system transitions between being attractive and repulsive. In other
words, the red circles represent areas that, if overlapping, would result in repulsive forces between
Figure 14. Calculation of percent coverage for a substrate containing 20
particles. Circles represent diameter of particle with ligand shell.
38
particles. The maximum
number of particles that can fit
onto the substrate surface
without feeling any repulsive
force at all is 86.8 and the
particles must be placed in the
staggered configuration
depicted. Thus, for systems
with particle numbers greater
than 86.8, we surmise that the
only way particles can be
deposited onto the substrate is
for the sum of the Van der
Waals substrate force,
fluctuating forces, gravity, and attractive forces with nearby particles to overcome the repulsive
force between the closest particles.
4.3. Deposition Rate
Another way to analyze the vertical fall of the particles is to use an exponential fall rate,
rather than average time to hit the substrate. This may be especially useful as the average time to
hit has a great deal of variation due to the last particle taking a very large time to find a space on
the substrate in which to sit.
The average height of all particles can be plotted over time and fit to an exponential decay
curve to determine the time constant. Figure 16 displays the output data for one of the 50 particle
simulations, with the exponential decay curve plotted on top of the data. Mathematica’s “Findfit”
Figure 15. Depiction of maximum number of particles that can fit on the
substrate without any repulsive forces acting. Diameter of circles
represents distance where Lennard-Jones force will become repulsive. If
any red shells overlap, a repulsive force results.
39
function was used to
determine the decay rate for
the curve. The exponential
fit looks adequate to describe
the data, with a calculated R-
squared value of 0.9942.
Note that the factor in front
of t in the exponential is the
inverse of the time constant
in units of μs-1. Recall that
the exponential decays to a height of 15 nm (not zero!) since the particle centers are 15 nm above
the substrate when the particles have settled.
Repeating this fitting procedure for all data runs, the average time constants were found
and are plotted in Figure 17 for the three particle numbers considered. The results reveal a slightly
different picture from that of Figure 12. Here, the mean time constant, or mean fall time, is very
close for systems with all numbers of particles. The value does increase slightly for systems with
higher numbers of particles (from 136 μs for 20 particles to 140 μs for 80 particles), but not to the
extent of the increase in mean
deposition time. Like the graph
for mean deposition time, the
graph for mean time constant
shows wider variation in the
system with the fewest number
of particles. The error band is
clearly tighter for systems with
larger numbers of particles.
Figure 17. Difference in mean time constant for systems with 20, 50,
and 80 particles. Error bars denote standard errors.
Figure 16. Decrease in zaverage for all particles over time for a system of 50
particles acted upon by Van der Waals substrate force, Lennard-Jones
interparticle force, gravity and viscous and fluctuating forces.
40
The reason that Figure 12 shows such a wide difference in deposition times between
systems with different numbers of particles is most likely due to the effect of outliers in the system.
For some simulation runs in systems with higher numbers of particles, the last couple of particles
took significantly longer to deposit onto the substrate. Thus, during a relatively long period of time,
the average height above the substrate fluctuated just above 15 nm. Such fluctuations would have
little effect on the exponential curve fit. However, they could have a pronounced effect on the
average deposition time.
As a concrete example, during data run 11 for a system with 80 particles, 78 particles had
reached the substrate after about 0.72 ms. The 79th particle was deposited at 1.2 ms, and the last
particle at 1.9 ms. These last 2 particles increased the average deposition time by 34 μs, but
inclusion of the last two particles did not greatly influence the calculated value of time constant.j
Thus, Figure 12 shows us that there are significant differences in the amount of time
required for all particles to reach the substrate. However, Figure 17 shows us that the time required
for most particles to reach the substrate does not depend significantly on the number of particles in
the system. In applying this to a system where we wish to deposit hematite nanoparticles onto a
silicon dioxide substrate for some purpose, however, we must consider that more particles will be
deposited in a given amount of time if the number density of particles in the fluid is higher. For
example, from Figure 17, we see that in a system with 20 particles, the mean fall time is 20
particles/136 μs ≈ 0.147 particles/μs, while that for a system with 80 particles is 80 particles/140
μs ≈ 0.571 particles/μs. Thus, we can conclude that as long as the particles will all fit onto the
substrate, it is best to use a higher concentration of particles in our solvent when conducting some
experiment to deposit hematite nanoparticles onto a silicon dioxide substrate.
j The average deposition time for this data run changed from 162 μs to 128 μs when the last two particles
were excluded from the calculation. Calculated value of time constant was 131 μs for this data run.
41
4.4. Pattern Formation
We now turn to consider
whether the interparticle
interactions result in the particles
forming ordered patterns when they
deposit onto the substrate. We have
seen that the size of the substrate
limits the number of particles that
may be deposited, and that larger
numbers of particles will decrease
the distance between particles on
the substrate and therefore increase
the forces. Thus, we hypothesize
that particle positions will be better
ordered or more correlated for larger
numbers of particles.
We first look at
representative output from a system
with 80 particles and examine both
qualitatively and quantitatively
whether interparticle forces have
caused patterns to form. To
determine the influence of
interparticle forces, we compare the
results to those of an 80 particle
system where Lennard-Jones
Figure 18. Final positions of particles on substrate for an 80 particle
system acted upon by Lennard-Jones interparticle forces, viscous,
and fluctuating forces. Particles able to move after reaching
substrate. Size of particle equal to hematite nanoparticle.
Figure 19. Final positions of particles on substrate for an 80 particle
system acted upon by viscous and fluctuating forces. Particles fell to
substrate due to gravity only, and were able to move after reaching
substrate. Size of particle equal to hematite nanoparticle.
42
interparticle forces have been
eliminated.
Figure 18 shows the
particle positions for a
system where the Lennard-
Jones force is active, while
Figure 19 shows the particles
for the system where the
interparticle force is absent.
Visually, the particles in
Figure 18 appear to be more
ordered. Conversely, in
Figure 19, some of the
particles go so far as to
overlap, which is unphysical,
but results by treating the
particles as point objects in
the simulation.
Figures 20 and 21
provide a more quantitative
comparison of the two
systems. The final positions on the substrate were analyzed to develop the two figures. For each
particle, the distance to every other particle on the substrate was calculated and tabulated, then
placed in rank order from closest particle to furthest particle. Figure 20 shows a histogram of the
distance to the closest particle for all 80 particles in each system. Note that when Lennard-Jones
forces are active, the hematite nanoparticles never overlap (i.e. lowest interparticle distance is 20
(a) Lennard-Jones forces active between particles
(b) No Lennard-Jones interparticle forces
Figure 20. Comparison of histograms showing distance to nearest particle
for two different 80-particle systems. (a) In the first system, Lennard-
Jones forces prevent the particles from getting too close or very far away.
(b) When no Lennard-Jones forces are present, as in the second system, the
distance to nearest particle shows a wider spread.
43
(a) Lennard-Jones forces active between particles
(b) No Lennard-Jones interparticle forces
Figure 21. Comparison of histograms showing distances to five nearest particles for two different 80-particle
systems. (a) In the first system, Lennard-Jones forces act between particle pairs. (b) When no Lennard-
Jones forces are present, as in the second system, the distances cover a wider spread.
44
nm), but when Lennard-Jones forces are absent, the viscous and fluctuating forces acting on the
particle points have put the particle centers as close as 3 nm. In addition, the spread in closest
distances is much wider for the system where no interparticle forces are active. There, closest
distances range between 3 and 49 nm, whereas in the system with Lennard-Jones forces present,
the spread is only 15 nm.
Figure 21 depicts a histogram for the five closest particles in each system and shows a
similar trend. Again, when the Lennard-Jones force is active, we do not see distances closer than
the diameter of the hematite nanoparticles. In addition, this time we can see that the distances to
closest particles, second closest, and so on, appear in tighter groupings for the chart where the
Lennard-Jones force is active. With no interparticle forces, the distances again show a wider spread.
For the system with Lennard-Jones forces, although the hematite nanoparticles do not
overlap, the ligand shells do, as depicted visually in Figure 22. This is the same system as that
shown in Figure 18, except the
particle diameters are sized to
represent the hydrodynamic
diameter. The data in Figures 20
and 21 show that many of the
nearest particles are at distances
such that repulsive forces will be
felt between particles. In fact, we
would expect most of the particles
to be present in the bin ranging
from 34 to 36 nm, the location of
the minimum potential in the
L e n n a r d - J o n e s c u r v e .
Figure 22. Final positions of particles on substrate for an 80 particle
system acted upon by Lennard-Jones interparticle forces, viscous, and
fluctuating forces. Particles able to move after reaching substrate.
Dark blue circles represent hematite nanoparticles, while light blue
circles represent the ligand shell diameter.
45
The reason why the particles are so close can be understood by considering many factors
acting in concert. First of all, although Figure 20 indicates that a given particle is likely to be
repelled by the particle closest to it, Figure 21 indicates that the same particle may be attracted to
other nearby particles. In some cases, other nearby particles will attract a given particle toward
another particle that repels it.
In addition, we must consider that the particles are constantly moving due to the action of
the viscous and fluctuating forces. Thus, Figure 22 represents only a snapshot in time. Also, with
80 particles on the substrate, we approach the limiting value of 86.8 particles—the maximum
number of particles that will fit on the substrate without any repulsive forces at all, but only if the
particles are not moving. With attractive forces acting on the particles when distances are beyond
34.6 nm, and with viscous and fluctuating forces continuously acting upon the particles, we can
intuitively understand why the configuration is likely to have at least some repulsive forces acting
between particles.
Additional insight can be gained by considering representative magnitudes of the forces
acting between particles. Recall that the standard deviation of the random force is 8.3 x 10-11 N.
For a particle center-center distance of 21.4 nm, the Lennard-Jones repulsive force between
particles is 8.5 x 10-12 N. Since this value is less than the standard deviation of the random force,
we can imagine that the random forces could push the particles to this distance. In addition, we
should consider that the sum of the Van der Waals and steric interparticle forces at this same
distance is 5.2 x 10-10 N, which exceeds the standard deviation of the fluctuating force. Thus, more
accurate insights could be gained by using the models of the Van der Waals and steric forces
individually, rather than estimating their influence using the Lennard-Jones model. In fact, the
Lennard-Jones model underestimates the actual value of the repulsive force for distances less than
about 29 nm. However, even the sum of the Van der Waals and steric forces is less than that of the
standard deviation of the random forces for interparticle distances greater than about 23 nm. Thus,
46
we should be able to attain greater
particle separations on the
substrate for systems with larger
steric forces. Such systems
should be studied in future
simulation projects.
Finally, we compare the
results for an 80-particle system,
as depicted in Figure 18, to those
for a 50-particle system. Figure
23 depicts representative
positions on the substrate for a
50-particle system. Visually, we
can see there is less order to the
particle patterns, and more
variation in distances between
particles as compared to the 80-
particle system. These intuitive
insights are supported by
looking at a histogram of
nearest particle distances,
shown in Figure 24. As with
the 80-particle system
represented by Figure 20a,
interparticle repulsive forces
prevent the particles from approaching closer than 20 nm. However, in the 50-particle system some
Figure 24. Histogram showing distance to nearest particle for 50-
particle system where Lennard-Jones forces act between particles. As
with the 80-particle system, interparticle repulsive forces prevent the
particles from getting too close. However, there is more spread in the
distances for the 50-particle system.
Figure 23. Final positions of particles on substrate for a 50 particle
system acted upon by Lennard-Jones interparticle forces, viscous, and
fluctuating forces. Particles able to move after reaching substrate. Size
of particle equal to hematite nanoparticle.
47
of the nearest particles are over 40 nm away, at distances where Lennard-Jones attractive forces are
relatively low on the order of 10-14 N. Thus, because the substrate is less crowded, we can
understand that some particles will be more dispersed due to the relatively low attractive forces at
greater distances.
CHAPTER 5
SUMMARY, FUTURE WORK, AND CONCLUDING REMARKS
5.1. Summary
A Fortran simulation program was developed to model the behavior of hematite
nanoparticles in hexane solution as they deposited onto a silicon dioxide substrate. The simulation
employed periodic boundary conditions in the x and y directions, with the substrate simulated in
the z (vertical) direction. The active box was a cube with 300 nm side lengths. Systems with 20,
50, and 80 particles were modeled, and simulation results were analyzed to determine whether the
number of particles that comprised a system affected particle deposition time and rate, as well as
particle deposition pattern on the substrate.
The mean time for all particles to settle onto the substrate was clearly longer for systems
with greater numbers of particles. However, in systems with greater numbers of particles, the last
few particles sometimes took significantly longer to deposit onto the substrate, thus increasing the
overall average settling time.
Fall time was also analyzed using deposition rate, which was determined for a given
particle number by using the mean time constant for all data runs. The time constant for each
simulation run was found by fitting an exponential curve to data for the average height above the
substrate over time. The mean time constant was slightly longer for systems with greater numbers
of particles. The dependence of mean time constant on system particle number was not as
pronounced as that for mean time for all particles to reach the substrate.
49
Deposition pattern analysis showed that interparticle forces did cause patterns to form on
the substrate surface, and patterns were more ordered or correlated for systems with greater
numbers of particles.
The results indicate that when depositing hematite nanoparticles onto a substrate, a solution
with a greater number of particles should be chosen to attain the best particle distribution on the
substrate in the optimum amount of time.
The Fortran simulation program employed to model deposition of the nanoparticles onto a
substrate was shown to adequately model the viscous and fluctuating forces of the system via tests
such as comparing output kinetic energy to the equipartition theorem, and comparing particle
behavior to random walk motion. In addition, the Lennard-Jones interparticle forces behaved as
expected in output results. However, the Lennard-Jones force model was not as accurate as the
individual Van der Waals and steric force models for particles at extremely close distances. The
difference in the two models could affect the output particle deposition patterns.
5.2. Future Work
Many extensions to this work should be completed to expand our knowledge of particle
deposition rate and pattern formation onto a substrate. The following five important areas are
discussed in the remainder of this section: improve the force model; develop a more quantitative
pattern analysis technique; simulate a more realistic substrate, such as MCM-41; vary parameters
such as ligand shell thickness to determine the effect on deposition pattern formation; and optimize
the simulation algorithm.
5.2.1. Improve the Force Model
As discussed in Chapter 4, when particles were at extremely close distances the computed
Lennard-Jones forces were orders of magnitude lower than the sum of the Van der Waals and steric
forces. The Lennard-Jones force was chosen due to its computational efficiency. However, the
50
differences in force magnitudes at close distances could affect formation of patterns on the substrate
surface. Therefore, a future version of the algorithm should include separate Van der Waals and
steric interparticle forces in place of the Lennard-Jones force. Output results should be compared
with the results attained using the Lennard-Jones model and differences should be noted. If
differences are significant, then the more specific Van der Waals and steric forces should be
incorporated in the simulation in place of the simpler Lennard-Jones force.
In addition, this project modeled only Van der Waals and steric interparticle forces, but
other forces could affect particle deposition time and pattern formation. In some cases, electrostatic
interactions can play a role in nonpolar solvents such as hexane. (Hsu, Dufresne and Weitz) Thus,
the role of the surfactants as charge carriers and their contribution to electrostatic interactions
between particles should be examined. A screened Coulomb force should be added to the model
as appropriate. Also, magnetic interactions play a strong role if the ligands are short. Therefore,
incorporation of magnetic interactions into the model should also be considered.
Finally, when calculating the force due to gravity, the effect of buoyancy on the particles
was not considered. In the future, buoyancy due to the hexane solution should be incorporated into
the simulation algorithm.
5.2.2. Develop a More Quantitative Pattern Analysis Technique
This project analyzed pattern formation qualitatively by looking at output pattern results,
and quantitatively by looking at histograms of distances between particles. As a baseline, results
were compared to simulations where no interparticle forces were present.
Additional quantitative analysis methods should be explored. First of all, the “hard sphere”
model could be chosen as the baseline for comparison using the histogram data. Furthermore, two-
dimensional Fourier transforms or Wavelet transforms of particle deposition patterns may reveal
mathematically significant patterns.
51
5.2.3. Simulate a More Realistic Substrate
A flat silicon dioxide substrate was used for this study. In applications, mesoporous silicate
substrates such as MCM-41 are often employed. (Hondow and Fuller) Thus, future studies should
simulate these more complicated porous structures.
5.2.4. Vary Parameters to Determine Effect on Deposition Pattern
This study modeled particles of only one size, with a single ligand shell thickness and one
distance between ligand headgroups. The simulation program shows great promise for modeling a
variety of systems without having to expel the resources required to experiment with such systems
in the laboratory. For example, as mentioned in Chapter 4, a higher steric force could result in
patterns where particles are more widely and evenly spaced. As described in Chapter 2, steric force
can be adjusted by either increasing the ligand shell thickness L or decreasing the distance between
headgroups h. A series of simulations can be conducted for various values of L and h to determine
the combination of factors that produces the most desirable substrate pattern.
Simulations can be conducted to vary other parameters as well. For example, as mentioned
in Chapter 1, all three magnetic iron oxide nanoparticles (hematite, magnetite, and maghemite)
have interesting properties suited to a variety of applications. The simulation program could easily
be modified to simulate the properties of one of the other iron oxide nanoparticles. The composition
of the fluid and substrate could also be easily changed.
5.2.5. Optimize the Fortran algorithm
Simulations with large numbers of particles took a great deal of time. For example, trial
simulations of systems with 100 particles took nearly a day to run on a laptop computer.
Simulations for systems with 80 particles sometimes lasted over 12 hours. For such large
simulations, optimization of the Fortran algorithm would pay huge dividends by reducing the time
required to run a given simulation, thus allowing more simulations to be run in a given amount of
52
time. Two specific improvements that could be easily incorporated are optimizing the force
calculation loop and establishing a cut-off distance for calculation of the interparticle forces.
The force between two particles caused by the Lennard-Jones potential is the same for each
particle, and thus need only be calculated once. When the Fortran routine was initially established,
however, the force was calculated twice—once for each particle of a two particle pair. The
additional calculations were of little consequence for small numbers of particles. However, cutting
the number of calculations in half for large particle numbers can save a great deal of time.
Therefore, steps should be taken to alter the force calculation algorithm to make it more efficient.
Figure 3, which depicts the Lennard-Jones potential, indicates that forces between particles
should approach zero at large distances. In fact, at a distance of 2.5σ, the pair potential is only 1.6
percent of the minimum potential energy. (Allen and Tildesley p. 29) Thus, we can save further
time in the force calculation loop by eliminating force calculations if the distance between two
particles is beyond a given distance. The optimum cut-off distance to employ in this simulation
should be determined, and then the algorithm modified to include this distance in future simulations.
5.3. Concluding Remarks
A stochastic dynamics Fortran simulation program was developed that successfully
modeled hematite nanoparticle deposition onto a silicon dioxide substrate. The method shows great
promise in answering important questions related to deposition time and pattern formation on a
substrate surface, and can be used to conduct computational experiments at less cost in time and
resources than such experiments would cost in the laboratory. For example, ligand shell parameters
can be adjusted over a wide range of values to modify the steric force and determine the effect on
pattern formation. With slight modifications, the method can also be applied to nanoparticles or
substrates made from different substances. This would allow the program to be used to answer
53
questions regarding the difference in deposition rates between particles composed of different
substances. (Hondow and Fuller)
APPENDIX 1
EQUATIONS FOR VAN DER WAALS ENERGIES AND FORCES
This appendix shows the steps used to modify Hamaker’s equation for Van der Waals
energies and forces into the forms that were used in this study. Hamaker’s original paper presents
his formula in terms of dimensionless variables. This appendix converts the equation into a form
dependent on the radius of the particles, height above the substrate (for particle-substrate energies
and forces), and distance between centers of the particles (for particle-particle energies and forces).
First, we develop the equations used between each particle and the substrate. Next, the equations
used to model the energies and forces between particles are developed.
We begin with Hamaker’s formula for the energy between two spheres of diameters D1 and
D2, where the surfaces are located a distance d apart:
𝑉 = −𝐴1
12{
𝑦
𝑥2+𝑥𝑦+𝑥+
𝑦
𝑥2+𝑥𝑦+𝑥+𝑦+ 2 ln
𝑥2+𝑥𝑦+𝑥
𝑥2+𝑥𝑦+𝑥+𝑦} . ( 49 )
Here, x and y are defined by
𝑥 = 𝑑
𝐷1 , 𝑎𝑛𝑑 𝑦 =
𝐷2
𝐷1 , ( 50 )
and A is known as Hamaker’s constant, determined in Hamaker’s original paper using the density
of atoms, ionization potential, and polarizability of the atoms involved.
For the case of a sphere approaching a flat substrate, we allow D1 to represent the diameter
of the sphere, and D2 that of the substrate. In order for D2 to represent the substrate, we allow the
value of D2—and therefore the dimensionless variable y—to approach infinity. We look at each
term in equation (49) in turn, taking the limit as y approaches infinity, to develop an expression for
55
the energy between the sphere and flat substrate. We apply L’Hopital’s Rule to any indeterminate
forms in deriving the solution.
For the first term, we have
lim𝑦→∞
𝑦
𝑥2+𝑥𝑦+𝑥= lim
𝑦→∞
1
𝑥=
1
𝑥. ( 51 )
The second term is
lim𝑦→∞
𝑦
𝑥2+𝑥𝑦+𝑥+𝑦= lim
𝑦→∞
1
𝑥+1=
1
𝑥+1, ( 52 )
and the third term is
lim𝑦→∞
2 ln𝑥2+𝑥𝑦+𝑥
𝑥2+𝑥𝑦+𝑥+𝑦= lim
𝑦→∞2 ln
𝑥
𝑥+1= 2 ln
𝑥
𝑥+1 . ( 53 )
Substituting these last three expressions into equation (49), we find the expression developed by
Hamaker for the energy between a sphere, or spherical particle, and a flat surface:
𝑉𝑉𝑝𝑠 = −𝐴1
12{1
𝑥+
1
𝑥+1+ 2 ln
𝑥
𝑥+1}. ( 54 )
Substituting x = d/D1, we find
𝑉𝑉𝑝𝑠 = −𝐴1
12{𝐷1
𝑑+
1𝑑
𝐷1+
𝐷1𝐷1
+ 2 ln
𝑑
𝐷1𝑑
𝐷1+
𝐷1𝐷1
} = −𝐴1
12{𝐷1
𝑑+
𝐷1
𝑑+ 𝐷1+ 2 ln
𝑑
𝑑+ 𝐷1}. ( 55 )
In the algorithm used in this project, the Van der Waals particle-substrate force acts in the vertical
direction only. The vertical distance between the center of the particle and the substrate is denoted
by z, while the radius of the particle is denoted by r. Recalling that d represents the distance
between surfaces, we can substitute D1 = 2r and d = z – r into equation (55) to find
𝑉𝑉𝑝𝑠 = −𝐴1
6{
𝑟
𝑧 − 𝑟+
𝑟
𝑧+𝑟+ ln
𝑧−𝑟
𝑧+𝑟}, ( 56 )
which is the desired expression for energy in terms of the radius r and height above the substrate z.
We calculate the force acting between particle and substrate by finding the gradient using
𝐹 = −∇𝑉𝑉𝑝𝑠 = −𝜕𝑥
𝜕𝑑
𝜕𝑉𝑉𝑝𝑠
𝜕𝑥= −
1
𝐷1
𝜕𝑉𝑉𝑝𝑠
𝜕𝑥. ( 57 )
We take the derivative of equation (54), where energy is expressed in terms of x, and find
56
𝐹(𝑥) = 𝐴
12𝐷1{−1
𝑥2 − 1
(𝑥+1)2+
2(𝑥+1)
𝑥[
1
(𝑥+1)−
𝑥
(𝑥+1)2]} =
𝐴
12𝐷1{−1
𝑥2 − 1
(𝑥+1)2+
2
𝑥−
2
(𝑥+1)}. ( 58 )
Substituting x = d/D1 into equation (58), we find
𝐹(𝑑) = 𝐴
12{−𝐷1
𝑑2 − 𝐷1
𝑑2+2𝑑𝐷1+ 𝐷12 +
2
𝑑−
2
(𝑑+𝐷1)} . ( 59 )
Finally, we substitute D1 = 2r to obtain
𝐹(𝑑) = 𝐴
6{1
𝑑−
𝑟
𝑑2 − 1
(𝑑+2𝑟)−
𝑟
(𝑑+2𝑟)2} , ( 60 )
which is an expression for force in terms of the radius r and distance between the particle and
substrate surfaces d. Substituting d = z – r into equation (60), we modify the equation to
𝐹 = 𝐴
6{
1
𝑧−𝑟−
𝑟
(𝑧−𝑟)2−
1
(𝑧 + 𝑟)−
𝑟
(𝑧 + 𝑟)2} , ( 61 )
which is the desired expression for force in terms of radius r and height above the substrate z.
To derive the form of Hamaker’s equation used for the energy between particles, we begin
again with Hamaker’s formula, equation (49). Since the particles used in this program were all of
equal size, then D1 equals D2, and therefore y = 1. Thus, Hamaker’s formula can be written more
simply as
𝑉𝑉𝑝𝑝 = −𝐴1
12{
1
𝑥2+2𝑥+
1
𝑥2+2𝑥+1+ 2 ln
𝑥2+2𝑥
𝑥2+2𝑥+1} . ( 62 )
We substitute x = d/D1 and find
𝑉𝑉𝑝𝑝 = −𝐴1
12{
𝐷12
𝑑2+2𝑑𝐷1+
𝐷12
𝑑2+2𝑑𝐷1+ 𝐷12 + 2 ln
𝑑2+2𝑑𝐷1
𝑑2+2𝑑𝐷1+𝐷12} . ( 63 )
As before, we next substitute D1 = 2r to obtain
𝑉𝑉𝑝𝑝 = −𝐴1
12{
4𝑟2
𝑑2+4𝑑𝑟+
4𝑟2
𝑑2+4𝑑𝑟 + 4𝑟2 + 2 ln𝑑2+4𝑑𝑟
𝑑2+4𝑑𝑟+4𝑟2}, ( 64 )
where, as before, d represents the distance between the surfaces of the particles. We substitute
d = 𝔇 – 2r, where 𝔇 is the distance between particle centers, and find
𝑉𝑉𝑝𝑝 = −𝐴1
6{
2𝑟2
𝔇2− 4𝑟2 + 2𝑟2
𝔇2 + ln𝔇2− 4𝑟2
𝔇2 } , ( 65 )
which is the desired expression for Van der Waals energy between particles in terms of radius r and
distance between particle centers 𝔇.
57
The force between two spheres can be found by differentiating equation (62) for the energy.
The equation for force between two equally sized spheres is also provided by Hamaker and is
repeated as
𝐹𝑉𝑝𝑝 = −𝐴1
6𝐷1{2(𝑥+ 1)
𝑥2+2𝑥−
(𝑥+ 1)
(𝑥2+2𝑥)2−
2
(𝑥+1)−
1
(𝑥+1)3}. ( 66 )
As before, we substitute x = d/D1 to find an expression in terms of d, the distance between surfaces
of the particles. After some simplification, we have the expression
𝐹𝑉𝑝𝑝 = −𝐴1
6{2(𝑑 + 𝐷1)
𝑑2+2𝑑𝐷1−
(𝑑 + 𝐷1)𝐷12
(𝑑4 +4𝑑3𝐷1+4𝑑2𝐷12)
− 2
(𝑑 + 𝐷1)−
𝐷12
(𝑑3+3𝑑2𝐷1 +3𝑑𝐷12+ 𝐷1
3)}.( 67 )
Next, we substitute D1 = 2r to find
𝐹𝑉𝑝𝑝 = −𝐴1
6{2(𝑑 + 2𝑟)
𝑑2+4𝑑𝑟−
4𝑟2(𝑑 + 2𝑟)
(𝑑2 +4𝑑𝑟)2−
2
(𝑑 + 2𝑟)−
4𝑟2
(𝑑+2𝑟)3}. ( 68 )
Finally, we substitute d = 𝔇 – 2r to modify the expression to the form
𝐹 = −𝐴1
6{
2𝔇
𝔇2+4𝑟2 − 4𝑟2𝔇
(𝔇2 +4𝑟2)2−
2
𝔇−
4𝑟2
𝔇3 }, ( 69 )
which is the desired expression for the force between two particles in terms of the radius r and
distance between centers 𝔇.
APPENDIX 2
REPRESENTATIVE MAGNITUDES OF FORCES USED IN THIS STUDY
This appendix shows the magnitudes of some of the forces used in this study.
Table 4. Representative Magnitudes of Forces Used in this Study
Force Magnitude (N) Comments
Van der Waals to Substrate 6.849 x 10-19 Calculated for z = 250 nm, r = 10 nm
Van der Waals to Substrate 4.630 x 10-16 Calculated for z = 50 nm, r = 10 nm
Van der Waals to Substrate 1.707 x 10-13 Calculated for z = 15 nm, r = 10 nm (On
the Substrate)
Standard Deviation of
Random Force
8.313 x 10-11 For calculation, assume T = 298K,
viscosity of hexane, hematite
nanoparticle of 10 nm radius, time step
0.1 ns, and hydrodynamic radius of 15
nm (to include ligand shell)
Gravitational Force 2.159 x 10-19 For calculation, assume mass of
hematite nanoparticle of 10 nm radius
Table 5. Comparison of Van der Waals, Steric, and Lennard-Jones Forces for Various Interparticle
Distances.
Distance
Between Centers
𝔇 (nm)
Steric Force
Magnitude (N)
Van der Waals
Force Magnitude
(N)
Difference in
Magnitudes of
Van der Waals
and Steric
Forces1 (N)
Lennard-Jones
Force1, 2 (N)
21 1.138 x 10-9 4.851 x 10-13 -1.137 x 10-9 -1.092 x 10-11
25 9.376 x 10-12 3.206 x 10-13 -9.055 x 10-12 -1.022 x 10-12
35 4.897 x 10-15 1.387 x 10-13 1.338 x 10-13 9.938 x 10-16
40 1.549 x 10-16 9.788 x 10-14 9.772 x 10-14 3.639 x 10-15 1 A negative force indicates repulsion, while a positive force indicates attraction. 2 Lennard-Jones force calculated using ε = 4.976 x 10-23 Joules, and σ = 30.85 nm.
APPENDIX 3
NUMERICAL INTEGRATION SCHEME DESCRIPTIONS
This appendix gives detailed descriptions or derivations of numerical integration schemes
discussed in the main body of this report.
A3.1. Euler Method
The simplest numerical integration scheme to derive is the Euler method. We begin with
Newton’s second law
�̈⃑�(𝑡) = 1
𝑚�⃑�[�⃑�(𝑡), �̇⃑�(𝑡), 𝑡], ( 70 )
which can be separated into six coupled first-order differential equations for position �⃑� and velocity
�⃑�, given by
�̇⃑�(𝑡) = �⃑�(𝑡), and ( 71 )
�̇⃑�(𝑡) = 1
𝑚�⃑�[�⃑�(𝑡), �⃑�(𝑡), 𝑡], ( 72 )
where t represents time, �⃑� is the force, and m is the mass.
The values of �̇⃑�(𝑡) and �̇⃑�(𝑡), which represent the time derivatives of �⃑� and �⃑�, can be found
by using a Taylor series expansion of �⃑� and �⃑� around time t, given by (Giordano and Nakanishi p.
456)
�⃑�(𝑡 + ∆𝑡) = �⃑�(𝑡) + 𝑑𝑥
𝑑𝑡∆𝑡 +
1
2
𝑑2𝑥
𝑑𝑡2 (∆𝑡)2 + ⋯, and ( 73 )
�⃑�(𝑡 + ∆𝑡) = �⃑�(𝑡) + 𝑑�⃑⃗�
𝑑𝑡∆𝑡 +
1
2
𝑑2�⃑⃗�
𝑑𝑡2 (∆𝑡)2 + ⋯. ( 74 )
60
If we ignore the terms in the Taylor series expansion of order (∆𝑡)2, solve the expansions
for d�⃑�/dt and d�⃑�/dt, respectively, and then substitute into equations (71) and (72), we obtain
�̇⃑�𝑛 = �⃑�𝑛 = 1
∆𝑡(�⃑�𝑛+1 − �⃑�𝑛), and ( 75 )
�̇⃑�𝑛 = 1
𝑚�⃑�[�⃑�𝑛, �⃑�𝑛, 𝑡] =
1
∆𝑡(�⃑�𝑛+1 − �⃑�𝑛). ( 76 )
In equations (75) and (76), note that we have replaced �⃑�(t + Δt) by �⃑�n+1 and �⃑�(t + Δt) by
�⃑�n+1 to represent values of position and velocity at the next time step, as well as �⃑�(t) by �⃑�n and �⃑�(t)
by �⃑�n to represent values of position and velocity at the current time step. Time derivatives of
position and velocity at the current time step were similarly replaced. Solving equations (75) and
(76) for �⃑�n+1 and �⃑�n+1, we are left with the equations used in the Euler numerical integration method
for two coupled first-order differential equations, namely,
�⃑�𝑛+1 = �⃑�𝑛 + �⃑�𝑛∆𝑡, and ( 77 )
�⃑�𝑛+1 = �⃑�𝑛 + 1
𝑚�⃑�[�⃑�𝑛, �⃑�𝑛, 𝑡]∆𝑡 = �⃑�𝑛 + �⃑�𝑛∆𝑡, ( 78 )
where the acceleration �⃑�n = �⃑�[�⃑�n,�⃑�n,t]/m. In deriving the Euler method, we ignored terms of order
(Δt)2 in the Taylor series expansion, and thus errors of this same order accumulate with each time
step. However, the overall error globally is of order Δt, since the total error is proportional to the
number of time steps N multiplied by the error of each time step, or (Giordano and Nakanishi p.
457)
𝑂𝑣𝑒𝑟𝑎𝑙𝑙 𝐸𝑟𝑟𝑜𝑟 = 𝑁Δ𝑡2 = 𝑡𝑡𝑜𝑡𝑎𝑙
Δ𝑡Δ𝑡2 ∝ ∆𝑡. ( 79 )
A3.2. Verlet Algorithm
The Verlet algorithm (Verlet) provides a method for updating the position at each time step
and is given as
�⃑�𝑛+1 = 2�⃑�𝑛 − �⃑�𝑛−1 + �⃑�𝑛
𝑚∆𝑡2 + 𝑂[(∆𝑡)4]. ( 80 )
61
The method may be derived by expanding both �⃑�(t + Δt) = �⃑�n+1 and 𝑥(t – Δt) = �⃑�n-1 in Taylor series,
adding the expansions, and then solving for �⃑�n+1. (Van Gunsteren and Berendsen, A Leap-Frog
Algorithm for Stochastic Dynamics) The Taylor series are expressed as
�⃑�𝑛+1 = �⃑�𝑛 + �⃑�𝑛∆𝑡 + 1
2�⃑�𝑛∆𝑡2 +
1
6
𝑑�⃑⃗�𝑛
𝑑𝑡∆𝑡3 + 𝑂[(∆𝑡)4], and ( 81 )
�⃑�𝑛−1 = �⃑�𝑛 − �⃑�𝑛∆𝑡 + 1
2�⃑�𝑛∆𝑡2 −
1
6
𝑑�⃑⃗�𝑛
𝑑𝑡∆𝑡3 + 𝑂[(∆𝑡)4]. ( 82 )
Adding the two Taylor expansions, we find
�⃑�𝑛+1 = 2�⃑�𝑛 − �⃑�𝑛−1 + �⃑�𝑛∆𝑡2 + 𝑂[(∆𝑡)4], ( 83 )
which is another form of the Verlet algorithm, in terms of acceleration rather than Force and mass.
A3.3. Leapfrog Algorithm
The leapfrog algorithm provides a method to update the position at each time step and the
velocity at each half time step. It is presented as (Van Gunsteren and Berendsen, A Leap-Frog
Algorithm for Stochastic Dynamics)
�⃑�𝑛+1 = �⃑�𝑛 + �⃑�𝑛+
1
2
∆𝑡 + 𝑂[(∆𝑡)3], and ( 84 )
�⃑�𝑛+
1
2
= �⃑�𝑛−
1
2
+ 𝐹𝑛⃗⃗ ⃗⃗ ⃑
𝑚Δ𝑡 + 𝑂[(∆𝑡)3]. ( 85 )
As with the previous methods, the leapfrog algorithm can be derived by starting with a Taylor series
expansion for �⃑�n+1 = �⃑�(tn + Δt), or
�⃑�𝑛+1 = �⃑�(𝑡𝑛 + ∆𝑡) = �⃑�𝑛 + �⃑�𝑛∆𝑡 + 1
2�⃑�𝑛(∆𝑡)2 + 𝑂[(∆𝑡)3]. ( 86 )
Next, by using the half-time-step Δt/2, we note that the Taylor series expansion for the half step
velocity is
�⃑� (𝑡 + ∆𝑡
2) = �⃑�(𝑡) + �⃑�(𝑡)
∆𝑡
2+ 𝑂[(∆𝑡)2]. ( 87 )
Rewriting in terms of our subscript notation, we see that
�⃑�𝑛+
1
2
= �⃑�𝑛 + �⃑�𝑛∆𝑡
2+ 𝑂[(∆𝑡)2], ( 88 )
62
We can solve this expression for �⃑�n and then substitute back into equation (86). The acceleration
terms cancel, and we are left with equation (84), the expression to update position in the leapfrog
algorithm.
The equation to update velocity in the leapfrog algorithm is derived by using equation (88)
for the half time step velocity, along with the equation for half time step velocity at the previous
half step �⃑�n-1/2. To find the previous half step velocity, we start with the Taylor series expansion
�⃑� (𝑡 − ∆𝑡
2) = �⃑�(𝑡) − �⃑�(𝑡)
∆𝑡
2+ 𝑂[(∆𝑡)2]. ( 89 )
Rewriting in terms of our subscript notation, we find the equivalent expression
�⃑�𝑛−
1
2
= �⃑�𝑛 − �⃑�𝑛∆𝑡
2+ 𝑂[(∆𝑡)2]. ( 90 )
Note that the right hand sides of equations (89) and (90) are equivalent to those of equations (87)
and (88), except that terms in odd powers of Δt are negative. If we subtract equation (90) from
equation (88) and rearrange terms, the �⃑�n terms and terms of order (Δt)2 cancel, and we are left with
�⃑�𝑛+
1
2
= �⃑�𝑛−
1
2
+ �⃑�𝑛Δ𝑡 + 𝑂[(∆𝑡)3], ( 91 )
which is an alternative form of the equation to update velocity in the leapfrog algorithm, expressed
in terms of acceleration rather than force and mass.
In the leapfrog algorithm, acceleration is calculated from the forces acting due to positions
at integer increments of the time step. Acceleration is then used to propagate the velocity forward
from one half-time-step to the next. The half-time-step velocities are then used to move the position
forward in integer increments of the time step. Note that errors at each time step of the leap-frog
algorithm are of the order of (Δt)3.
A3.4. Velocity Verlet Algorithm
The velocity verlet algorithm is a method that allows calculation of both the velocity and
position at integer time steps. To derive the equation for position, begin by adding xn+1 to both
63
sides of equation (83) in the Verlet algorithm to find (Sandvik)
2�⃑�𝑛+1 = �⃑�𝑛+1 + 2�⃑�𝑛 − �⃑�𝑛−1 + �⃑�𝑛∆𝑡2 + 𝑂[(∆𝑡)4]. ( 92 )
Define velocity at the current time step by using (Van Gunsteren and Berendsen)
�⃑�𝑛 = 𝑥𝑛+1− 𝑥𝑛−1
2∆𝑡+ 𝑂[(∆𝑡)2]. ( 93 )
Substitute equation (93) into equation (92) to derive the expression used to update position in the
velocity Verlet algorithm, which is
�⃑�𝑛+1 = �⃑�𝑛 + �⃑�𝑛∆𝑡 + 1
2�⃑�𝑛∆𝑡2. ( 94 )
To find the expression for velocity, begin by writing the Verlet position algorithm, equation
(83), for the current time step instead of the next time step as
�⃑�𝑛 = 2�⃑�𝑛−1 − �⃑�𝑛−2 + �⃑�𝑛−1∆𝑡2. ( 95 )
Now, add equations (83) and (95) and rearrange terms to obtain (Sandvik)
�⃑�𝑛+1 − �⃑�𝑛−1 = �⃑�𝑛 − �⃑�𝑛−2 + (�⃑�𝑛−1 + �⃑�𝑛)∆𝑡2. ( 96 )
We can rearrange equation (93), and also modify the subscripts, to find
�⃑�𝑛+1 − �⃑�𝑛−1 = 2�⃑�𝑛∆𝑡, and ( 97 )
�⃑�𝑛 − �⃑�𝑛−2 = 2�⃑�𝑛−1∆𝑡. ( 98 )
Substituting equations (97) and (98) into equation (96) and rearranging terms, we obtain
�⃑�𝑛 = �⃑�𝑛−1 + 1
2(�⃑�𝑛−1 + �⃑�𝑛)∆𝑡, ( 99 )
an expression for velocity at the current time step. We convert this equation to one of velocity for
the next time step and find
�⃑�𝑛+1 = �⃑�𝑛 + 1
2(�⃑�𝑛 + �⃑�𝑛+1)∆𝑡, ( 100 )
which is the expression used to update velocity in the velocity Verlet algorithm.
64
A3.5. Velocity Verlet/Leapfrog Algorithm
One undesirable aspect of the velocity Verlet algorithm is that both the old and new
accelerations are required in order to obtain the new value of velocity. The velocity
Verlet/Leapfrog method is a modified form of the velocity Verlet algorithm that uses less memory
and does not require the old value of acceleration. (Strobl and Bannerman) The position values
are updated using equation (94), just as in the velocity Verlet algorithm. Then, the half time step
value of velocity is calculated using equation (88). Now, if we solve equation (88) for the current
time step velocity, we find
�⃑�𝑛 = �⃑�𝑛+
1
2
− �⃑�𝑛∆𝑡
2. ( 101 )
If we substitute equation (101) into equation (100), we obtain
�⃑�𝑛+1 = �⃑�𝑛+
1
2
+ �⃑⃗�𝑛+1
2∆𝑡, ( 102 )
which is the Velocity Verlet/Leapfrog algorithm expression to update the velocity.
A3.6. Leap-Frog Algorithm for Stochastic Dynamics
Van Gunsteren and Berendsen (Van Gunsteren and Berendsen, A Leap-Frog Algorithm for
Stochastic Dynamics) developed a stochastic dynamics algorithm that reduces to the leapfrog
algorithm in the limit of small friction coefficient. The algorithm was designed to solve the pair of
first-order differential equations
𝑥�̇�(𝑡) = 𝑣𝑖(𝑡), and ( 103 )
𝑚𝑖�̇�𝑖(𝑡) = 𝐹𝑖[𝑥𝑖(𝑡)] − 𝑚𝑖𝛾𝑖𝑣𝑖 + 𝑅𝑖(𝑡), ( 104 )
where m is mass, γ is the friction coefficient, R(t) represents the random, fluctuating force, and the
subscript i refers to each of the three coordinate directions for each of the N particles present in a
stochastic system. Thus, i ranges in value from 1 to 3N. Note that for a system with particles of
equal size and mass, we can drop the subscript i from the mass m and friction coefficient.
65
The equations for the Van Gunsteren/Berendsen stochastic dynamics algorithm were
verified mathematically as part of this project. In this appendix, we merely present the equations
that were used in the Fortran program developed, and do not present their detailed derivation or
explanation. Additional equations and further explanation of their derivation can be found in the
paper by Van Gunsteren and Berendsen. The computational scheme of the method developed is
summarized in the following paragraphs.
When using the Van Gunsteren and Berendsen algorithm, position and velocity are updated
using
�⃑�𝑛+1 = �⃑�𝑛 + �⃑�𝑛+
1
2
Δ𝑡
(𝛾Δ𝑡)[exp (+
𝛾𝛥𝑡
2) − exp (−
𝛾Δ𝑡
2)] + �⃑�
𝑛+1
2
(Δ𝑡
2) − �⃑�
𝑛+1
2
(−Δ𝑡
2) +
𝑂[(Δ𝑡)3], and ( 105 )
�⃑�𝑛+
1
2
= �⃑�𝑛−
1
2
exp(−𝛾𝛥𝑡) + �⃑�𝑛
𝑚(𝛾Δ𝑡) Δ𝑡 [1 − exp(−𝛾Δ𝑡)] + �⃑⃗�𝑛 (
Δ𝑡
2) −
exp(−𝛾𝛥𝑡) �⃑⃗�𝑛 (−Δ𝑡
2) + 𝑂[(Δ𝑡)3], ( 106 )
which are the stochastic dynamics equivalent of equations (84) and (85). Like the leapfrog
algorithm presented previously, note that the errors in position and velocity for each time step are
of order (Δt)3. In addition, note that calculation of the next values of position and velocity depends
upon the variables �⃑�𝑛+
1
2
(Δ𝑡
2), �⃑�
𝑛+1
2
(−Δ𝑡
2), �⃑⃗�𝑛 (
Δ𝑡
2), and �⃑⃗�𝑛 (−
Δ𝑡
2). Each of these expressions
represents an integral of the random force �⃑⃗�(t)—multiplied by various quantities—evaluated over
a certain integral of time. Both �⃑�𝑛−
1
2
(Δ𝑡
2) and �⃑⃗�𝑛 (−
Δ𝑡
2) are evaluated over the time integral (tn-1/2,
tn), and thus are correlated. They will be related in the method below through the random Gaussian
variable Yv. Similarly, �⃑�𝑛+
1
2
(−Δ𝑡
2) and �⃑⃗�𝑛 (
Δ𝑡
2) are correlated since they are both different
integrals of �⃑⃗�(t) over the same time period (tn, tn+1/2). The random Gaussian variable Yx will be
used to correlate the latter two variables.
66
To initiate the stochastic dynamics leapfrog algorithm, initial positions and velocities must
be given to all of the particles in the colloidal system. The values used for initial conditions in this
study were presented in the main body of this report. The method also requires an initial value for
the variable �⃑�n-1/2 (Δt/2)k. An initial value for this variable can be found by sampling from a
Gaussian distribution with zero mean and variance
𝜎12 = ⟨𝑋
𝑛−1
2
2 (Δ𝑡
2)⟩ =
𝑘𝑇
𝑚𝛾2 𝐶 (𝛾Δ𝑡
2), ( 107 )
where
𝐶 (𝛾Δ𝑡
2) = 𝛾Δ𝑡 − 3 + 4exp (−
𝛾𝛥𝑡
2) − exp(−𝛾𝛥𝑡), ( 108 )
and where k is Boltzmann’s constant and T is the temperature of the system. After the initial
conditions are determined, the systematic force 𝐹𝑖[𝑥𝑖(𝑡)] acting on each particle in each of the three
coordinate directions is evaluated based upon the initial positions. Note that these are the forces
that depend upon position (and thus a conservative potential field) only.
Next, the variable Yv is determined by sampling from a Gaussian distribution of zero mean
and variance
𝜎𝑌𝑣2 =
𝑘𝑇
𝑚𝐵 (
𝛾𝛥𝑡
2) /𝐶 (
𝛾𝛥𝑡
2), ( 109 )
where 𝐶 (𝛾𝛥𝑡
2) is given by equation (108), and 𝐵 (
𝛾𝛥𝑡
2) is given by
𝐵 (𝛾Δ𝑡
2) = 𝛾Δ𝑡[exp(+𝛾𝛥𝑡) − 1] − 4[exp (+
𝛾Δ𝑡
2) − 1]
2. ( 110 )
Recall that Yv is used to correlate �⃑�n-1/2(Δt/2) and �⃑⃗�n(-Δt/2). The values of Yv and �⃑�n-1/2(Δt/2) are
then used to determine Vn(-Δt/2) using
�⃑⃗�𝑛 (−Δ𝑡
2) = �⃑�
𝑛−1
2
(Δ𝑡
2) 𝛾𝐷 (
𝛾Δ𝑡
2) / 𝐶 (
𝛾𝛥𝑡
2) + 𝑌𝑣 , ( 111 )
k This is the random variable denoted in equation (105) by �⃑�n+1/2 (Δt/2), but at the previous half-time-step.
67
where 𝐶 (𝛾𝛥𝑡
2) is calculated using equation (108), and 𝐷 (
𝛾𝛥𝑡
2) using
𝐷 (𝛾Δ𝑡
2) = 2 − exp (+
𝛾𝛥𝑡
2) − exp (−
𝛾𝛥𝑡
2). ( 112 )
The random Gaussian variable �⃑⃗� n(Δt/2) is determined by sampling from a Gaussian
distribution of zero mean and variance
𝜌12 = ⟨𝑉𝑛
2 (Δ𝑡
2)⟩ = −
𝑘𝑇
𝑚 [exp(−𝛾𝛥𝑡) − 1]. ( 113 )
After this variable is determined, we can calculate the next half-time-step of velocity using equation
(106).
The random Gaussian variable Yx, used to correlate �⃑� n+1/2(-Δt/2) and �⃑⃗� n(Δt/2), is
determined by sampling from a Gaussian distribution of zero mean and variance
𝜎𝑌𝑥2 =
𝑘𝑇
𝑚𝛾2
𝐵(−𝛾Δ𝑡
2)
[exp(−𝛾Δ𝑡)−1]. ( 114 )
Using Yx, we can now find �⃑�n+1/2(-Δt/2) using
�⃑�𝑛+
1
2
(−Δ𝑡
2) = �⃑⃗�𝑛 (
Δ𝑡
2)
1
𝛾
𝐷(−𝛾Δ𝑡
2)
[exp(−𝛾𝛥𝑡)−1]+ 𝑌𝑥 . ( 115 )
�⃑�n+1/2(Δt/2) is then determined by sampling from a Gaussian distribution of zero mean and variance
given by equation (107), the same equation that was used to determine the variance of Xn-1/2(Δt/2).
Finally, the positions at the next time step are determined using equation (105).
In a three-dimensional molecular dynamics routine, each of these steps is performed for
each particle in all three dimensions. The routine then repeats step-by-step for a specified time
period, or until some predetermined condition is reached.
APPENDIX 4
RANDOM NUMBER GENERATION
As discussed in the main body of this report, proper generation of random numbers is vital
to producing an accurate molecular dynamics algorithm. Two types of random numbers are of
interest in molecular dynamics: uniform random numbers falling on the interval from zero to one,
and random numbers falling on a Gaussian distribution with zero mean and some specified standard
deviation.
A4.1. Uniform Random Number Generators
Uniform random number generators supplied by most software routines produce pseudo
random numbers using linear congruential generators (LCG) (Press, Flannery and Teukolsky p.
267), which use an equation of the form (Giordano and Nakanishi p. 512)
𝑥𝑛+1 = (𝑎𝑥𝑛 + 𝑏)𝑚𝑜𝑑 𝑚, ( 116 )
where xn, a, b, and m are integers, and mod refers to the modulus function. The equation is
initialized with a random seed x0. The reason the numbers generated using LCGs are called pseudo
random is that any sequence started with the same random seed will produce the same sequence of
random numbers. The value of the constants a and b in equation (116) has been a subject of
extensive research. Values should be chosen carefully to ensure high quality random numbers. For
example, if a is even, then xn+1 is always even if b is even, and always odd if b is odd, effectively
cutting the number of random numbers able to be produced in half. (Giordano and Nakanishi pp.
512 - 513)
69
Important factors to consider when choosing an appropriate pseudo random number
generator include its speed, period, accuracy, lack of correlation, and uniformity. (Giordano and
Nakanishi p. 513) In any pseudo random number generator, the random numbers will eventually
repeat. The period tells us how many random numbers are produced before the sequence repeats
itself. Accuracy gives us the resolution of the random values produced between 0 and 1.
Correlation refers to similarities between random numbers produced in sequence. For example, if
a random number generator is bad, then successive random pairs of numbers produced will appear
to fall on lines when plotted, while successive random triplets of numbers produced will fall on
planes in three-dimensional plots. (Katzgraber) Uniformity tells us whether the numbers produced
tend to “fill the interval of space” where they are generated, or whether they tend to “cluster” in
various regions. A variety of statistical tests are available to test the quality of random number
generation schemes. (Katzgraber)
Press, et. al., have discussed and analyzed four alternative random number generators that
are all superior to the standard LCG random number generator. (Press, Flannery and Teukolsky
pp. 269 - 274) The ran0( ) and ran1( ) methods discussed by Press, et. al. were inappropriate for
this study since they do not pass all statistical tests and since the periods are not long enough.
(Katzgraber) The ran2( ) method presented by Press, et. al. was chosen since it passes all statistical
tests and has a period on the order of 1018. (Katzgraber) The period for this project had to exceed
100 billion to be acceptable. To understand why, for the Fortran program implemented to analyze
hematite nanoparticles in Chapter 4, the number of random numbers required for a 100-particle
system analyzed for 20 million cycles—simulating 2 msec of real time—was on the order of 100
billion.
Random statistical tests for correlation and for uniformity were conducted using the ran2( )
random number generator. To test for correlation, 1000 random triplets were successively
produced and then plotted in three dimensions using Mathematica. If the random number generator
70
was bad, then the random
triplets produced would
appear to fall on planes within
the three-dimensional cube.
However, the ran2( ) random
number generator produced
points that tended to fill the
space of the cube, as shown in
Figure 25.
To test for uniformity,
1,000 random numbers were
generated and placed in
equally-sized bins from 0 to 1,
then plotted on a histogram as
depicted in Figure 26. If the
distribution was perfectly
uniform, we would expect that
100 random numbers would
fall into each bin. Clearly, the
numbers are not perfectly
uniform. However, we can
determine a confidence level
in the uni formi ty of the
distribution by applying the
chi-square test to the data
Figure 25. Correlation test for Ran2( ) random number generator. One
thousand successive triplets of random numbers were produced and
plotted. Since the successive triplets tend to fill the space, and do not
fall into visible planes, successive random numbers are not correlated.
Figure 26. Uniformity test for Ran2( ) random number generator. One
thousand random numbers were generated and then placed into 10
equally-sized bins between 0 and 1. Approximately 100 numbers should
fall within each bin. Note that tick marks are located at the center of
each bin.
71
depicted in Figure 26. (Giordano and Nakanishi pp. 520 - 524) (Jain) We begin by calculating
(Giordano and Nakanishi p. 520)
𝜒2 = ∑(𝑁𝑖− 𝑛𝑖𝑑𝑒𝑎𝑙)
2
𝑛𝑖𝑑𝑒𝑎𝑙𝑖 , ( 117 )
where Ni represents the number of random numbers falling into bin i, and nideal is the theoretical
number of random numbers that should fall within a bin. The chi-square test is a hypothesis test.
In this case, we hypothesize that our distribution is uniform. Tabulated values of chi-square for
various confidence levels exist. If the value of chi-square calculated using equation (117) is less
than the tabulated value, then we can accept the hypothesis that our distribution is uniform. For
the data shown in Figure 27, the calculated value of chi-square is 5.14. The tabulated value of chi-
square for 10 bins at a 90% confidence level is 14.68. (Jain) Since the calculated value of chi-
square is less than the tabulated value, we may accept our hypothesis that the ran2( ) routine has
produced a uniform distribution with 90% confidence.
A4.2. Gaussian Random Number Generators
The stochastic dynamics algorithm required selection of random numbers from a Gaussian
distribution of zero mean and specified standard deviation. Allen (pp. 347 – 348) discusses three
methods that may be used to produce random numbers on a Gaussian distribution. For this study,
all three methods were verified to produce random variables on a Gaussian distribution, but the
third method was implemented in the stochastic dynamics algorithm. To initiate the method, we
first calculate
𝑅 = (∑ 𝜉𝑖 − 6) 12𝑖=1 /4 , ( 118 )
where 𝜉𝑖 represent uniform random numbers generated on the interval from 0 to 1. Next, we
calculate a random number on a Gaussian distribution with zero mean and unit standard deviation
using the polynomial
72
휁 = ((((𝑎9𝑅2 + 𝑎7)𝑅
2 + 𝑎5)𝑅2 + 𝑎3)𝑅2 + 𝑎1)𝑅, ( 119 )
where the polynomial coefficients are defined by
𝑎1 = 3.949846138,
𝑎3 = 0.252408784,
𝑎5 = 0.076542912,
𝑎7 = 0.008355968, and
𝑎9 = 0.029899776. ( 120 )
After using equation (119) to find a random number on a Gaussian distribution of zero
mean and unit width, the number may be converted to a random Gaussian number of standard
deviation σ by
휁′ = 𝜎휁, ( 121 )
where ζ’ is the random number sampled from the specified distribution.
To test the random Gaussian number generator, the routine was used to generate 100,000
random numbers chosen from a Gaussian distribution of zero mean and unit width. The numbers
generated were then placed in bins of width 0.1 and plotted in Figure 27. The Gaussian function
was plotted on the same figure for comparison. The calculated mean of all 100,000 values was
0.0023, while the calculated variance was 1.0045. Based upon these results, the performance of
the random Gaussian number generator was considered to be sufficient for use in this project.
73
Figure 27. Verification of Gaussian random number generator. The
100,000 numbers generated fell on a normal distribution with
approximately zero mean and unit width.
APPENDIX 5
SIMULATION ALGORITHMS
This appendix presents the Fortran computer code used for two of the simulations
performed as part of this project. The first code presented is the Van Gunsteren/Berendsen
stochastic dynamics algorithm implemented in three dimensions to simulate hematite nanoparticle
depositions onto a substrate. The second algorithm is a two dimensional version of the program
that was implemented in order to allow particles that had already deposited to move on the substrate
under the action of the Lennard-Jones, viscous, and fluctuating forces for an input period of time.
A5.1. Three-Dimensional Stochastic Dynamics Algorithm
to Model Hematite Nanoparticle Deposition onto a Substrate
c This program uses a Molecular Dynamics simulation to model the interactions
c between N dipoles in 3 dimensions. All dipoles are able to move
c within a cubic grid of size 300 nm. The initial positions of the dipoles
c are assigned such that the particles are in an ordered pattern near the
c top of the box, while the velocities are assigned randomly.
c Force between the dipoles is modeled using the Lennard-Jones
c potential. After acceleration is calculated using the Lennard-Jones
c force, a Leapfrog algorithm developed by van Gunsteren and Berendsen is used
c to calculate the next steps of position and velocity, taking into account
c frictional and fluctuating forces.
c
c The specific Lennard-Jones force used in this program was designed to
c model the Van der Waals particle-particle force between hematite
c particles in hexane solution with an SiO2 substrate, along with a
c Steric force between particles that have a 5 nm thickness of ligand
c shell and 5 nm distance between head groups.
c
c This version of the program also incorporates the force of gravity
c in the z direction. Thus, periodic boundary conditions on the bottom
c surface of the box are eliminated to simulate a substrate surface.
c
75
c This version of the program also adds a Van der Waals force acting
c between the particles and the substrate in the z direction. When the
c particles reach a value of z equal to the radius of the particle plus
c the thickness of the ligand shell, the particle is assumed to have
c "hit bottom."
c
c This version of the program uses a random number generator recommended
c by the text "Numerical Methods in Fortran 77: The Art of Scientific
c Computing." The user is asked to input a negative integer seed for
c the random number generator.
c
c This version also only prints out snapshots of the data. The user
c is asked to input the frequency of snapshots taken. The user is
c also prompted to input the number of nsec for which the simulation
c should be run.
c
c Variables are defined as follows:
c r = radius of nanoparticle (in meters)
c L = thickness of ligand shell
c mag = magnetization
c mu = magnetic dipole moment
c mass = mass of dipoles
c pi = the constant pi
c mu0 = the constant mu0
c T = temperature T (Kelvin)
c k = Boltzmann's constant k
c ktimeT = k*T
c sigma, eps = variables used to compute Lennard Jones force/potential
c DeltaT = time step
c size = size of 3D box where particles are moving
c visc = viscosity of fluid we are working with
c gamma = coefficient used to calculate viscous force
c N = number of nanoparticles (input by user)
c
real*8 r, L, mag, mu, mass, pi, mu0, T, k, ktimeT
real*8 sigma, eps, DeltaT, size, visc, gamma
integer N
c
c Set values for r, L, mag, T, sigma, eps, visc, DeltaT, and size:
c
r = 10.0D-9
L = 5.0D-9
mag = 312000.0D0
T = 298.0D0 !298.0K Room temperature
sigma = 30.85D-9
eps = 4.976D-23
visc = 2.97D-4 !2.97D-4 Viscosity of hexane
DeltaT = 1.0D-10
size = 300D-9
c
c Define values for constants pi, mu0, and k:
76
c
pi = 3.1415927D0
mu0 = 4.0D0*pi*1D-7
k = 1.3807D-23
c
c Request user input for number of particles:
c
print*, 'Enter Number of Particles, N: '
read*, N
c
c Begin calculating various quantities, and then printing them to
c the screen:
c
ktimeT = k*T
print*, 'k * T = ', ktimeT
c Calculate Magnetic Dipole Moment mu:
mu = mag*(4.0D0/3.0D0)*pi*r**3.0D0
print*, 'mu = ', mu
c Calculate mass of nanoparticle. Assume particle is made of hematite, which
c according to the internet has a density of 5255 kg/m**3:
mass = 5255.0D0*(4.0D0/3.0D0)*pi*r**3.0D0
c Calculate friction coefficient for viscous force.
gamma = 6.0D0*pi*visc*(r + L)/mass !This is for 3D
print*, 'friction coefficient = ', gamma
print*, 'mass = ', mass
pause !Pause to preview values printed to screen thus far.
call posvel(sigma, eps, mass, DeltaT, r, N, size, gamma, ktimeT)
pause
stop
end
c
c
******************************************************************************
c The following subroutine executes a "do loop" that repeatedly calculates the
c new positions and velocities resulting from the Lennard-Jones force acting between
c two magnetic dipoles.
c
subroutine posvel(sigma, eps, mass, DeltaT, r, N, size, gamma,
&ktimeT)
integer N, k1, k2, k3, k4, j1, j2, l1, l2, l3, idum, nsnaps
integer ttime, ltime
real*8 ran2, FlucF, gamma, ktimeT
real*8 sigma, eps, LJForce, LJnrg, mass, time, DeltaT, r, size
real*8 L, h
real*8 rxn(N), rxnp1(N), vxnMhalf(N), vxnPhalf(N)
real*8 ryn(N), rynp1(N), vynMhalf(N), vynPhalf(N)
real*8 rzn(N), rznp1(N), vznMhalf(N), vznPhalf(N)
real*8 Fzn(N), Fxn(N), Fyn(N), Fn(N)
real*8 distx, disty, distz, dist, T(N), V(N), Enrgy(N)
real*8 gdt, gdthalf, Bgdthalf, Cgdthalf, Dgdthalf
real*8 BMgdthalf, DMgdthalf, eq318, SDeq318
77
real*8 eq321, SDeq321, eq329, SDeq329, eq332, SDeq332
real*8 xXnMhalf(N), yXnMhalf(N), zXnMhalf(N)
real*8 xYv(N), yYv(N), zYv(N), xVnMhalf(N), yVnMhalf(N)
real*8 zvnMhalf(N), xVnhalf(N), yVnhalf(N), zVnhalf(N)
real*8 xYx(N), yYx(N), zYx(N), xXneghalf(N), yXneghalf(N)
real*8 zXneghalf(N), xXhalf(N), yXhalf(N), zXhalf(N)
real*8 TEnrgy, TKinetic, TPoten
real*8 TFx, TFy, TFz, Tvx, Tvy, Tvz, TForce, Tvel
real*8 vxcum, vycum, vzcum
real*8 Gforce, bottomtime, aveX, aveY, aveZ
real*8 pbttmtime(N), pbttmx(N), pbttmy(N)
logical hitbottom(N), allbottom
c Calculate Force of gravity acting on particle in z direction:
Gforce = 9.81D0*mass
c Ask user to input seed for ran2 random number generator function.
print*, 'input idum (negative integer): '
read*, idum
c Ask user to input total amount of time (tenth of nsec) simulation will
c be run:
print*, 'input time to run simulation (tenth of nsec): '
read*, ttime
c Ask user to input a number indicating how often data "snapshots"
c are taken. An inner do-loop runs from 1 to "nsnaps," and then data
c is output to a fort.10 file.
print*, 'input how many loops to skip before snapshot: '
read*, nsnaps
c Calculate number of iterations of outer loop, based upon total time
c of simulation and number of snapshots:
ltime = ttime/nsnaps
c Initialize time and bottomtime at 0.0:
time = 0.0D0
bottomtime = 0.0D0
c Initialize logical variable allbottom to .false.
allbottom = .false.
c Input values for thickness of ligand shell L and distance between
c heads h:
L = 5.0D-9
h = 5.0D-9
c Set initial x, y, and z positions such that particles are in an
c ordered array; initial positions are assigned such that, no matter
c what the particle density, approximately one-third of all
c particles are in each of three vertical layers. (NOTE: Previous
c routine for assigning initial positions randomly now appears in
c comment lines); assign initial velocities randomly; these are
c initial conditions for time t = 0. When we enter the do-loop
c initially, we'll be calculating the positions at time t = 1. Also
c initialize logical array hitbottom(N) to .false. for all particles.
c Initialize real array pbttmtime(N) to 0.0D0 for all particles.
c Initialize pbttmx(N) and pbttmy(N) to -1.0D0 for all particles.
do 33 k2 = 1, N, 1
hitbottom(k2) = .false.
78
pbttmtime(k2) = 0.0D0
pbttmx(k2) = -1.0D0
pbttmy(k2) = -1.0D0
rxn(k2) = (MOD(k2,6))*50.0D-9
ryn(k2) = (MOD(k2,36)/6)*50.0D-9
rzn(k2) = 250.0D-9 - (MOD(k2 + ((k2-1)/36),3))*50.0D-9
c76 rxn(k2) = (size/3.0D0)*(1.0D0 + 2.0D0*ran2(idum))
c ryn(k2) = (size/3.0D0)*(1.0D0 + 2.0D0*ran2(idum))
c rzn(k2) = (size/3.0D0)*(1.0D0 + 2.0D0*ran2(idum))
c too_close = 0.0
c do 79 k3 = 1, k2-1
c dist = dsqrt((rxn(k3) - rxn(k2))**2.0D0 +
c & (ryn(k3) - ryn(k2))**2.0D0 + (rzn(k3) - rzn(k2))**2.0D0)
c if (dist.lt.sigma) then
c too_close = too_close + 1.0
c print*, 'particle ',k2,' is too close to particle ', k3
c endif
c79 continue
c if (too_close.gt.0.1) goto 76
vxnMhalf(k2) = 2.0D0*(ran2(idum) - 0.5D0)
vynMhalf(k2) = 2.0D0*(ran2(idum) - 0.5D0)
vznMhalf(k2) = 2.0D0*(ran2(idum) - 0.5D0)
33 continue
c The velocities above may have a center of mass motion. We don't
c want this because the temperature (found using kinetic energy)
c should not depend on center of mass velocity.
c Therefore, the next section calculates the average velocity in the
c x, y, and z directions and sets it to zero.
vxcum = 0.0D0
vycum = 0.0D0
vzcum = 0.0D0
do 50 k4 = 1, N
vxcum = vxcum + vxnMhalf(k4)
vycum = vycum + vynMhalf(k4)
vzcum = vzcum + vznMhalf(k4)
50 continue
vxcum = vxcum/N
vycum = vycum/N
vzcum = vzcum/N
do 60 k4 = 1, N
c Print initial positions and velocities to screen; Before
c printing velocities, subtract net motion in x, y, z directions;
c also print out initial positions and velocities to fort.16 file:
print*, 'rxn(', k4,') = ', rxn(k4)
print*, 'ryn(', k4,') = ', ryn(k4)
print*, 'rzn(', k4,') = ', rzn(k4)
vxnMhalf(k4) = vxnMhalf(k4) - vxcum
vynMhalf(k4) = vynMhalf(k4) - vycum
vznMhalf(k4) = vznMhalf(k4) - vzcum
print*, 'vxnMhalf(', k4,') = ', vxnMhalf(k4)
print*, 'vynMhalf(', k4,') = ', vynMhalf(k4)
79
print*, 'vznMhalf(', k4,') = ', vznMhalf(k4)
write(16,78) k4, rxn(k4)*1.0D9, ryn(k4)*1.0D9, rzn(k4)*1.0D9,
&vxnMhalf(k4), vynMhalf(k4), vznMhalf(k4)
60 continue
c Add pause statement to preview initial conditions on screen:
pause
c Calculate some of the quantities that will be used in the van Gunsteren
c and Berendsen algorithm.
c
gdt = gamma*DeltaT
gdthalf = gdt/2.0D0
Cgdthalf = gdt - 3.0D0 + 4.0D0*(dexp(-gdthalf)) - dexp(-gdt)
Dgdthalf = 2.0D0 - dexp(gdthalf) - dexp(-gdthalf)
Bgdthalf = gdt*(dexp(gdt) - 1.0D0) - 4.0D0*(dexp(gdthalf) -
&1.0D0)**2.0D0
BMgdthalf = gdt*(-dexp(gdt) - 1.0D0) - 4.0D0*(dexp(-gdthalf) -
&1.0D0)**2.0D0
DMgdthalf = 2.0D0 - dexp(-gdthalf) - dexp(gdthalf)
eq318 = ktimeT*Cgdthalf/(mass*gamma**2.0D0)
SDeq318 = dsqrt(eq318)
eq321 = ktimeT*Bgdthalf/(mass*Cgdthalf)
SDeq321 = dsqrt(eq321)
eq329 = ktimeT*(1.0D0 - dexp(-gdt))/mass
SDeq329 = dsqrt(eq329)
eq332 = ktimeT*BMgdthalf/(mass*(dexp(-gdt) - 1.0D0)*
&gamma**2.0D0)
SDeq332 = dsqrt(eq332)
c Print quantities obtained above and pause to check results:
print*, 'gdt = ', gdt
print*, 'gdthalf = ', gdthalf
print*, 'Bgdthalf = ', Bgdthalf
print*, 'Cgdthalf = ', Cgdthalf
print*, 'Dgdthalf = ', Dgdthalf
print*, 'BMgdthalf = ', BMgdthalf
print*, 'DMgdthalf = ', DMgdthalf
print*, 'eq318 = ', eq318
print*, 'SDeq318 = ', SDeq318
print*, 'eq321 = ', eq321
print*, 'SDeq321 = ', SDeq321
print*, 'eq329 = ', eq329
print*, 'SDeq329 = ', SDeq329
print*, 'eq332 = ', eq332
print*, 'SDeq332 = ', SDeq332
pause
c
c Calculate initial values for xXnMhalf(N), yXnMhalf(N), zXnMhalf(N):
c
do 11 k3 = 1,N
xXnMhalf(k3) = FlucF(SDeq318, idum)
yXnMhalf(k3) = FlucF(SDeq318, idum)
zXnMhalf(k3) = FlucF(SDeq318, idum)
80
11 continue
c
c Write initial positions and velocities to screen and to fort.10 file:
c
write(*,77) time, (rxn(k1), ryn(k1), rzn(k1), vxnMhalf(k1),
&vynMhalf(k1), vznMhalf(k2), k1=1,N)
77 format (' ', 350(1p1e15.6))
write(10,*) 'time ','aveX ','aveY ','aveZ ','Tvx ','Tvy ',
&'Tvz ', 'TFx ', 'TFy ', 'TFz ', 'TKinetic ',
&'TPoten ','TForce ', 'Tvel ', 'TEnrgy '
c write(10,77) time*1.0D9, (rxn(k1)*1.0D9, ryn(k1)*1.0D9,
c &rzn(k1)*1.0D9, k1 = 1, N),(vxnMhalf(k1),vynMhalf(k1), vznMhalf(k1)
c &, k1 = 1, N)
c
c Purpose of outer do-loop is to print out the results to the screen
c after "nsnaps" nsec have elapsed.
c
do 41 l2 = 1, ltime, 1
c
c Inner do-loop calculates positions and velocities for "nsnaps" nsec.
c
c
do 42 l1 = 1, nsnaps, 1
c Enter do loop to update forces for all particles.
c Reset Total Energy, Total/Net Force (all particles), Total/Net
c velocity (all particles), Total Kinetic/Potential Energies,
c Total (sum of) Forces, and Total (sum of) velocities at 0.0
c prior to entering this do loop.
c
TEnrgy = 0.0D0
TForce = 0.0D0
Tvel = 0.0D0
TKinetic = 0.0D0
TPoten = 0.0D0
TFx = 0.0D0
TFy = 0.0D0
TFz = 0.0D0
Tvx = 0.0D0
Tvy = 0.0D0
Tvz = 0.0D0
do 3 j1 = 1, N, 1
c Initialize values of forces, potential energy, and kinetic
c energy at 0.0 before entering inner do loop:
Fn(j1) = 0.0D0
Fxn(j1) = 0.0D0
Fyn(j1) = 0.0D0
Fzn(j1) = 0.0D0
T(j1) = 0.0D0
V(j1) = 0.0D0
do 8 j2 = 1, N, 1
81
if (j1.eq.j2) goto 8
distx = rxn(j2) - rxn(j1)
disty = ryn(j2) - ryn(j1)
distz = rzn(j2) - rzn(j1)
call sep(distx, disty, distz, size)
dist = dsqrt(distx**2.0D0 + disty**2.0D0 +
&distz**2.0D0)
Fn(j1) = LJForce(dist, sigma, eps)
c Fn(j1) = 0.0D0
Fxn(j1) = Fxn(j1) + Fn(j1)*(distx/dist)
Fyn(j1) = Fyn(j1) + Fn(j1)*(disty/dist)
Fzn(j1) = Fzn(j1) + Fn(j1)*(distz/dist)
V(j1) = V(j1) + LJnrg(dist,sigma,eps)
c V(j1) = V(j1) + 0.0D0
8 continue
c Subtract gravity and substrate/particle force
c from the Force in the z direction:
c print*, 'Fzn(',j1,') = ', Fzn(j1),' before gravity and
c &substrate forces added.'
c print*, 'V(',j1,') = ', V(j1),' before gravity and
c &substrate forces added.'
Fzn(j1) = Fzn(j1) - Gforce - FSubstrate(r, rzn(j1))
c print*, 'Fzn(',j1,') = ', Fzn(j1),' after gravity and
c &substrate forces added.'
c Modify potential energy to include potential energy with
c substrate:
V(j1) = V(j1) + VSubstrate(r, rzn(j1))
c print*, 'V(',j1,') = ', V(j1),' after gravity and
c &substrate forces added.'
c pause
c print*, 'Fn(',j1,') = ',Fn(j1)
c print*, 'Fxn(',j1,') = ',Fxn(j1)
c print*, 'Fyn(',j1,') = ',Fyn(j1)
c print*, 'Fzn(',j1,') = ',Fzn(j1)
3 continue
c Pause to review forces on screen:
c pause
c Calculate half step velocities and new value of position. Comments
c in the following do-loop describe several interim steps.
do 15 k3 = 1,N
c
c Sample values of xYv(N), yYv(N), and zYv(N) from a Gaussian
c distribution, and then calculate xVnMhalf(N),
c yVnMhalf(N), and zVnMhalf(N), per step 3, page 180, of paper.
c
xYv(k3) = FlucF(SDeq321, idum)
xVnMhalf(k3) = xXnMhalf(k3)*gamma*Dgdthalf/Cgdthalf + xYv(k3)
yYv(k3) = FlucF(SDeq321, idum)
yVnMhalf(k3) = yXnMhalf(k3)*gamma*Dgdthalf/Cgdthalf + yYv(k3)
zYv(k3) = FlucF(SDeq321, idum)
zVnMhalf(k3) = zXnMhalf(k3)*gamma*Dgdthalf/Cgdthalf + zYv(k3)
82
c
c Sample values of xVnhalf(N), yVnhalf(N), and zVnhalf(N) from a
c Gaussian distribution, and then calculate the half-step velocities
c from equation 3.6:
c
xVnhalf(k3) = FlucF(SDEq329, idum)
vxnPhalf(k3) = vxnMhalf(k3)*dexp(-gdt) + Fxn(k3)*DeltaT*
&(1.0D0 - dexp(-gdt))/(mass*gdt) + xVnhalf(k3) - dexp(-gdt)*
&xVnMhalf(k3)
yVnhalf(k3) = FlucF(SDEq329, idum)
vynPhalf(k3) = vynMhalf(k3)*dexp(-gdt) + Fyn(k3)*DeltaT*
&(1.0D0 - dexp(-gdt))/(mass*gdt) + yVnhalf(k3) - dexp(-gdt)*
&yVnMhalf(k3)
c
c If particle has hit substrate at z = r+L, then we want to set future
c values of velocity and position in z direction equal to zero. Before
c calculating z values, check to see if particle has hit substrate:
c
if (abs(rzn(k3)).le.r+L) then !particle has hit substrate
vznPhalf(k3) = 0.0D0
else !particle has not hit substrate
zVnhalf(k3) = FlucF(SDEq329, idum)
vznPhalf(k3) = vznMhalf(k3)*dexp(-gdt) + Fzn(k3)*DeltaT*
&(1.0D0 - dexp(-gdt))/(mass*gdt) + zVnhalf(k3) - dexp(-gdt)*
&zVnMhalf(k3)
endif
c Finally, xYx(N), yYx(N), and zYx(N) are sampled from Gaussian
c distributions. Then the random variables xXneghalf(N), yXneghalf(N),
c and zXneghalf(N) are calculated. xXhalf(N), yXhalf(N), and zXhalf(N)
c are sampled from Gaussian distributions. From all of these
c variables, the positions at the next step are calculated.
c
xYx(k3) = FlucF(SDeq332, idum)
xXneghalf(k3) = xVnhalf(k3)*DMgdthalf/(gamma*(dexp(-gdt) -
&1.0D0)) + xYx(k3)
xXhalf(k3) = FlucF(SDeq318, idum)
rxnp1(k3) = rxn(k3) + vxnPhalf(k3)*DeltaT*(dexp(gdthalf) -
&dexp(-gdthalf))/gdt + xXhalf(k3)
& - xXneghalf(k3)
yYx(k3) = FlucF(SDeq332, idum)
yXneghalf(k3) = yVnhalf(k3)*DMgdthalf/(gamma*(dexp(-gdt) -
&1.0D0)) + yYx(k3)
yXhalf(k3) = FlucF(SDeq318, idum)
rynp1(k3) = ryn(k3) + vynPhalf(k3)*DeltaT*(dexp(gdthalf) -
&dexp(-gdthalf))/gdt + yXhalf(k3)
& - yXneghalf(k3)
c
c If particle has hit substrate at z = r+L, then we want to set future
c values of velocity and position in z direction equal to zero. Before
c calculating z values, check to see if particle has hit substrate:
c
83
if (abs(rzn(k3)).le.r+L) then !particle has hit substrate
rznp1(k3) = r+L
else !particle has not hit substrate
zYx(k3) = FlucF(SDeq332, idum)
zXneghalf(k3) = zVnhalf(k3)*DMgdthalf/(gamma*(dexp(-gdt) -
&1.0D0)) + zYx(k3)
zXhalf(k3) = FlucF(SDeq318, idum)
rznp1(k3) = rzn(k3) + vznPhalf(k3)*DeltaT*(dexp(gdthalf) -
&dexp(-gdthalf))/gdt + zXhalf(k3)
& - zXneghalf(k3)
endif
c Print interim values to screen as desired for troubleshooting:
c
c print*, 'xYv(',k3,') = ',xYv(k3)
c print*, 'xVnMhalf(',k3,') = ',xVnMhalf(k3)
c print*, 'xVnhalf(',k3,') = ',xVnhalf(k3)
c print*, 'vxnPhalf(',k3,') = ',vxnPhalf(k3)
c print*, 'xYx(',k3,') = ',xYx(k3)
c print*, 'xXneghalf(',k3,') = ',xXneghalf(k3)
c print*, 'xXhalf(',k3,') = ',xXhalf(k3)
c print*, 'rxnp1(',k3,') = ',rxnp1(k3)
c print*, ' '
c print*, 'yYv(',k3,') = ',yYv(k3)
c print*, 'yVnMhalf(',k3,') = ',yVnMhalf(k3)
c print*, 'yVnhalf(',k3,') = ',yVnhalf(k3)
c print*, 'vynPhalf(',k3,') = ',vynPhalf(k3)
c print*, 'yYx(',k3,') = ',yYx(k3)
c print*, 'yXneghalf(',k3,') = ',yXneghalf(k3)
c print*, 'yXhalf(',k3,') = ',yXhalf(k3)
c print*, 'rynp1(',k3,') = ',rynp1(k3)
c print*, ' '
c print*, 'zYv(',k3,') = ',zYv(k3)
c print*, 'zVnMhalf(',k3,') = ',zVnMhalf(k3)
c print*, 'zVnhalf(',k3,') = ',zVnhalf(k3)
c print*, 'vznPhalf(',k3,') = ',vznPhalf(k3)
c print*, 'zYx(',k3,') = ',zYx(k3)
c print*, 'zXneghalf(',k3,') = ',zXneghalf(k3)
c print*, 'zXhalf(',k3,') = ',zXhalf(k3)
c print*, 'rznp1(',k3,') = ',rznp1(k3)
c print*, ' '
15 continue
c Pause to preview interim values:
c pause
do 19 k1 = 1,N
c Calculate Final Kinetic energy for each particle, Total
c Kinetic energy of all particles, Total potential energy of all
c particles, Total force (sum of all forces) in x, y, and z directions,
c Total velocity (sum of all velocities) in x, y, and z directions,
c and Total Energy of all particles.
T(k1) = (0.5D0)*mass*(vxnPhalf(k1)**2.0D0 +
84
&vynPhalf(k1)**2.0D0 +vznPhalf(k1)**2.0D0)
TKinetic = TKinetic + T(k1)
TPoten = TPoten + V(k1)
TFx = TFx + Fxn(k1)
TFy = TFy + Fyn(k1)
TFz = TFz + Fzn(k1)
Tvx = Tvx + vxnPhalf(k1)
Tvy = Tvy + vynPhalf(k1)
Tvz = Tvz + vznPhalf(k1)
c For now, the following two lines are comment lines. If added back in, the
c lines provide a method to calculate the total energy of each particle, and
c also a different method to calculate total energy.
c Enrgy(k1) = T(k1) + V(k1)
c TEnrgy = TEnrgy + Enrgy(k1)
c
c Check to make sure the newly calculated positions are not outside of the box.
c If they are, use the modulus
c function to bring the particle in at the other side of the box:
if (rxnp1(k1).gt.size) then
rxnp1(k1) = dmod(rxnp1(k1),size)
elseif (rxnp1(k1).lt.0.0D0) then
rxnp1(k1) = rxnp1(k1) + size
endif
if (rynp1(k1).gt.size) then
rynp1(k1) = dmod(rynp1(k1), size)
elseif (rynp1(k1).lt.0.0D0) then
rynp1(k1) = rynp1(k1)+ size
endif
c For the top of the box, we don't want to use periodic boundary conditions.
c Rather, if the particle adjusts to a height higher than the box, we will
c readjust the particle height so that it is *at* the top of the box.
if (rznp1(k1).gt.size) then
rznp1(k1) = size
c To simulate a substrate, eliminate the periodic boundary conditions in
c the negative z direction. Note that it is still possible for the particle
c to "hop" back up in the z direction due to random thermal fluctuations.
c The logical array hitbottom(N) keeps track of which particles have hit
c the substrate. The particle is considered to have "hit bottom" when its
c center is located at a distance of z = r+L
elseif (rznp1(k1).le.(r+L)) then
if (hitbottom(k1).eqv..true.) then
goto 4 !Already set values below.
endif
rznp1(k1) = r+L
hitbottom(k1) = .true.
pbttmtime(k1) = time
pbttmx(k1) = rxnp1(k1)
pbttmy(k1) = rynp1(k1)
vznPhalf(k1) = 0.0D0
endif
c Now, set "final" values equal to "initial" values to be used
85
c during next iteration:
4 rxn(k1) = rxnp1(k1)
ryn(k1) = rynp1(k1)
rzn(k1) = rznp1(k1)
xXnMhalf(k1) = xXhalf(k1)
yXnMhalf(k1) = yXhalf(k1)
zXnMhalf(k1) = zXhalf(k1)
vxnMhalf(k1) = vxnPhalf(k1)
vynMhalf(k1) = vynPhalf(k1)
vznMhalf(k1) = vznPhalf(k1)
c print*, 'T(',k1,') = ', T(k1)
19 continue
c Pause to look at particle kinetic energies on screen:
c
c pause
c Check to see if all particles have hit bottom yet. If all have hit
c bottom, then record the bottom time.
if (allbottom.eqv..false.) then
do 88 l3 = 1,N
if (hitbottom(l3).eqv..false.) then
goto 89
endif
88 continue
allbottom = .true.
bottomtime = time
89 endif
time = time + DeltaT
42 continue
c
c Calculate total force, net velocity of all particles, and total
c energy for those cases where data is output to screen and fort.10:
TForce = (TFx**2.0D0 + TFy**2.0D0 + TFz**2.0D0)
Tvel = (Tvx**2.0D0 + Tvy**2.0D0 + Tvz**2.0D0)
TEnrgy = TKinetic + TPoten
c
c Calculate average values of x, y, and z for all particles.
c
aveX = 0.0D0
aveY = 0.0D0
aveZ = 0.0D0
do 1 j1 = 1, N
aveX = aveX + rxn(j1)
aveY = aveY + ryn(j1)
aveZ = aveZ + rzn(j1)
1 continue
aveX = aveX/N
aveY = aveY/N
aveZ = aveZ/N
c Write results to screen:
c
write(*,77) time, aveX, aveY, aveZ, Tvx, Tvy, Tvz, TFx, TFy,
86
&TFz, TKinetic, TPoten, TForce, Tvel, TEnrgy
c Write same quantities to a fort.10 file. Time in nanoseconds and distance in nanometers.
write(10,77) time*1.0D9, aveX*1.0D9, aveY*1.0D9,
&aveZ*1.0D9, Tvx, Tvy, Tvz, TFx, TFy, TFz, TKinetic, TPoten,
&TForce, Tvel, TEnrgy
if(allbottom.eqv..true.) goto 90 !stop execution of program
41 continue
c Output bottom time for all particles to fort.11 file. Output x and
c y coordinates of particles when they hit bottom, alongside final
c x, y, and z coordinates, to fort.12 file:
90 do 2 j1 = 1, N
write(11,*) j1, pbttmtime(j1)*1.0D9
write(12,78) j1, pbttmx(j1)*1.0D9, pbttmy(j1)*1.0D9,
&rxn(j1)*1.0D9 ,ryn(j1)*1.0D9, rzn(j1)*1.0D9, vxnMhalf(j1),
&vynMhalf(j1), vznMhalf(j1)
2 continue
78 format (' ', i3, 8(1p1e15.6))
print*, 'bottomtime = ',bottomtime,' seconds'
write(11,*) bottomtime*1.0D9
return
end
c
c
******************************************************************************
c The following function is used to calculate the Lennard-Jones Force.
c
function LJForce(dist, sigma, eps)
real*8 LJForce, dist, sigma, eps
LJForce = dist*((24.0D0*eps/(dist**2.0D0))*
& ((sigma/dist)**6.0D0)*(1.0D0 - 2.0D0*((sigma/dist)**6.0D0)))
return
end
c
c
******************************************************************************
c
c
******************************************************************************
c The following function calculates the Lennard-Jones energy of the dipole
c with respect to another dipole. Typical Lennard-Jones energy is divided in half
c because only half of the energy "belongs" to the particle under consideration. The other
c half "belongs" to the particle it is interacting with.
c
function LJnrg(dist, sigma, eps)
real*8 LJnrg, dist, sigma, eps
LJnrg = 2.0D0*eps*(((sigma/dist)**12.0D0) -((sigma/dist)**6.0D0))
return
end
c
c
******************************************************************************
87
c
c
******************************************************************************
c The following function calculates the attractive force between the substrate
c and the particle. For purposes of determining the Hamaker constant, it is
c assumed that the substrate is SiO2, the solution is hexane, and the
c particle is made of hematite.
c
function FSubstrate(r, z)
real*8 FSubstrate, r, z
FSubstrate = ((-4.0D-21)/6.0D0)*(1.0D0/(z-r) - r/((z-r)**2.0D0)
& - 1.0D0/(z+r) - r/((z+r)**2.0D0))
return
end
c
c
******************************************************************************
c
c
******************************************************************************
c The following function calculates the Van der Waals potential energy
c between a particle and substrate. For purposes of determining the Hamaker constant, it is
c assumed that the substrate is SiO2, the solution is hexane, and the
c particle is made of hematite.
c
function VSubstrate(r,z)
real*8 VSubstrate, r, z
VSubstrate = ((-4.0D-21)/6.0D0)*(r/(z-r) + r/(z+r)
& + dlog((z-r)/(z+r)))
return
end
c
c
******************************************************************************
c
c
******************************************************************************
c The following subroutine ensures that the particles are interacting with the particles that
c are closest to them. Note that sign(A,B) returns the value of A with the sign of B.
c
subroutine sep(distx, disty, distz, size)
real*8 distx, disty, distz, size
if (abs(distx).gt. 0.5D0*size) distx = distx - sign(size,distx)
if (abs(disty).gt. 0.5D0*size) disty = disty - sign(size,disty)
c Routine eliminated in z direction since we only look at z values between z = 0 and z =300
c if (abs(distz).gt. 0.5D0*size) distz = distz - sign(size,distz)
return
end
c
c
******************************************************************************
88
c
c
******************************************************************************
c The following function calculates a random number on a Gaussian
c distribution with zero mean and with width specified by the standard
c deviation (input to the function).
function FlucF(StdDev, idum)
real*8 ranU(12), ranG, R, a1, a3, a5, a7, a9, StdDev, FlucF
real*8 ran2
integer l2, idum
c Set values for polynomial coefficients:
a1 = 3.949846138D0
a3 = 0.252408784D0
a5 = 0.076542912D0
a7 = 0.008355968D0
a9 = 0.029899776D0
c Initialize ranG:
ranG = 0.0D0
do 43 l2 = 1, 12, 1
ranU(l2) = ran2(idum)
ranG = ranG + ranU(l2)
43 continue
R = (ranG - 6.0D0)/4.0D0
ranG = ((((a9*R**2.0D0+a7)*R**2.0D0+a5)*R**2.0D0+a3)*
&R**2.0D0+a1)*R
FlucF = StdDev*ranG
return
end
c
c
******************************************************************************
c
c
******************************************************************************
c This program used a slightly modified version of a random number generation routine
c called “ran2” that was found in NUMERICAL RECIPES IN FORTRAN 77: THE ART
c OF SCIENTIFIC COMPUTING (ISBN 0-521-43064-X). Only the first line of the
c function is provided here. Please consult this reference for full details of random
c number generation algorithms.
c
FUNCTION ran2(idum)
89
A5.2. Two-Dimensional Stochastic Dynamics Algorithm
to Model Particle Motion on the Substrate
c This program uses a Molecular Dynamics simulation to model the interactions
c between N dipoles in 2 dimensions. It is a modified version of the
c three dimensional program designed to examine motion of the particles
c on the substrate after all particles have settled. All dipoles are able to move
c within a square of size 300 nm. The initial positions of the dipoles
c are read from a data file, while velocities are assigned randomly.
c Force between the dipoles is modeled using the Lennard-Jones
c potential. After acceleration is calculated using the Lennard-Jones
c force, a Leapfrog algorithm developed by van Gunsteren and Berendsen is used
c to calculate the next steps of position and velocity, taking into account
c frictional and fluctuating forces.
c
c The specific Lennard-Jones force used in this program was designed to
c model the Van der Waals particle-particle force between hematite
c particles in hexane solution, along with a steric force between
c particles that have a 5 nm thickness of ligand shell and 5 nm
c distance between head groups.
c
c This version of the program uses a random number generator recommended
c by the text "Numerical Methods in Fortran 77: The Art of Scientific
c Computing." The user is asked to input a negative integer seed for
c the random number generator.
c
c This version also only prints out snapshots of the data. The user
c is asked to input the frequency of snapshots taken. The user is
c also prompted to input the number of nsec for which the simulation
c should be run.
c
c Variables are defined as follows:
c r = radius of nanoparticle (in meters)
c L = thickness of ligand shell
c mag = magnetization
c mu = magnetic dipole moment
c mass = mass of dipoles
c pi = the constant pi
c mu0 = the constant mu0
c T = temperature T (Kelvin)
c k = Boltzmann's constant k
c ktimeT = k*T
c sigma, eps = variables used to compute Lennard Jones force/potential
c DeltaT = time step
c size = size of 2D square where particles are moving
c visc = viscosity of fluid we are working with
c gamma = coefficient used to calculate viscous force
c N = number of nanoparticles (input by user)
c
real*8 r, L, mag, mu, mass, pi, mu0, T, k, ktimeT
90
real*8 sigma, eps, DeltaT, size, visc, gamma
integer N
c
c Set values for r, L, mag, T, sigma, eps, visc, DeltaT, and size:
c
r = 10.0D-9
L = 5.0D-9
mag = 312000.0D0
T = 298.0D0 !298.0K Room temperature
sigma = 30.85D-9
eps = 4.976D-23
visc = 2.97D-4 !2.97D-4 Viscosity of hexane
DeltaT = 1.0D-10
size = 300D-9
c
c Define values for constants pi, mu0, and k:
c
pi = 3.1415927D0
mu0 = 4.0D0*pi*1D-7
k = 1.3807D-23
c
c Request user input for number of particles:
c
print*, 'Enter Number of Particles, N: '
read*, N
c
c Begin calculating various quantities, and then printing them to
c the screen:
c
ktimeT = k*T
print*, 'k * T = ', ktimeT
c Calculate Magnetic Dipole Moment mu:
mu = mag*(4.0D0/3.0D0)*pi*r**3.0D0
print*, 'mu = ', mu
c Calculate mass of nanoparticle. Assume particle is made of hematite, which
c according to the internet has a density of 5255 kg/m**3:
mass = 5255.0D0*(4.0D0/3.0D0)*pi*r**3.0D0
c Calculate friction coefficient for viscous force.
gamma = 6.0D0*pi*visc*(r + L)/mass
print*, 'friction coefficient = ', gamma
print*, 'mass = ', mass
pause !Pause to preview values printed to screen thus far.
call posvel(sigma, eps, mass, DeltaT, r, N, size, gamma, ktimeT)
pause
stop
end
c
c
******************************************************************************
c The following subroutine executes a "do loop" that repeatedly calculates the
c new positions and velocities resulting from the Lennard-Jones force acting between
91
c two magnetic dipoles.
c
subroutine posvel(sigma, eps, mass, DeltaT, r, N, size, gamma,
&ktimeT)
integer N, k1, k2, k3, k4, j1, j2, l1, l2, l3, idum, nsnaps
integer ttime, ltime
real*8 ran2, FlucF, gamma, ktimeT
real*8 sigma, eps, LJForce, LJnrg, mass, time, DeltaT, r, size
real*8 L, h
real*8 rxn(N), rxnp1(N), vxnMhalf(N), vxnPhalf(N)
real*8 ryn(N), rynp1(N), vynMhalf(N), vynPhalf(N)
real*8 rzn(N), Fxn(N), Fyn(N), Fn(N)
real*8 distx, disty, dist, T(N), V(N), Enrgy(N)
real*8 gdt, gdthalf, Bgdthalf, Cgdthalf, Dgdthalf
real*8 BMgdthalf, DMgdthalf, eq318, SDeq318
real*8 eq321, SDeq321, eq329, SDeq329, eq332, SDeq332
real*8 xXnMhalf(N), yXnMhalf(N)
real*8 xYv(N), yYv(N), xVnMhalf(N), yVnMhalf(N)
real*8 xVnhalf(N), yVnhalf(N), zVnhalf(N)
real*8 xYx(N), yYx(N), xXneghalf(N), yXneghalf(N)
real*8 xXhalf(N), yXhalf(N)
real*8 TEnrgy, TKinetic, TPoten
real*8 TFx, TFy, Tvx, Tvy, TForce, Tvel
real*8 vxcum, vycum
real*8 aveX, aveY, aveZ
c Open data file containing initial positions of particles. Be sure to
c change the name as required, depending upon where data is stored:
open(20, FILE = 'part100.csv', STATUS = 'OLD')
c Ask user to input seed for ran2 random number generator function.
print*, 'input idum (negative integer): '
read*, idum
c Ask user to input total amount of time (tenth of nsec) simulation will
c be run:
print*, 'input time to run simulation (tenth of nsec): '
read*, ttime
c Ask user to input a number indicating how often data "snapshots"
c are taken. An inner do-loop runs from 1 to "nsnaps," and then data
c is output to a data file.
print*, 'input how many loops to skip before snapshot: '
read*, nsnaps
c Calculate number of iterations of outer loop, based upon total time
c of simulation and number of snapshots:
ltime = ttime/nsnaps
c Initialize time at 0.0:
time = 0.0D0
c Input values for thickness of ligand shell L and distance between
c heads h:
L = 5.0D-9
h = 5.0D-9
c Initial positions are read from a data file, while initial
c velocities are assigned randomly.
92
do 33 k2 = 1, N, 1
read(20,*) rxn(k2), ryn(k2), rzn(k2)
c Convert values to meters (from nanometers):
rxn(k2) = rxn(k2)*1.0D-9
ryn(k2) = ryn(k2)*1.0D-9
rzn(k2) = rzn(k2)*1.0D-9
vxnMhalf(k2) = 2.0D0*(ran2(idum) - 0.5D0)
vynMhalf(k2) = 2.0D0*(ran2(idum) - 0.5D0)
33 continue
c The velocities above may have a center of mass motion. We don't
c want this because the temperature (found using kinetic energy)
c should not depend on center of mass velocity.
c Therefore, the next section calculates the average velocity in the
c x and y directions and sets it to zero.
vxcum = 0.0D0
vycum = 0.0D0
do 50 k4 = 1, N
vxcum = vxcum + vxnMhalf(k4)
vycum = vycum + vynMhalf(k4)
50 continue
vxcum = vxcum/N
vycum = vycum/N
do 60 k4 = 1, N
c Print initial positions and velocities to screen; Before
c printing velocities, subtract net motion in x and y directions;
c also print out initial positions and velocities to fort.17 file:
print*, 'rxn(', k4,') = ', rxn(k4)
print*, 'ryn(', k4,') = ', ryn(k4)
print*, 'rzn(', k4,') = ', rzn(k4)
vxnMhalf(k4) = vxnMhalf(k4) - vxcum
vynMhalf(k4) = vynMhalf(k4) - vycum
print*, 'vxnMhalf(', k4,') = ', vxnMhalf(k4)
print*, 'vynMhalf(', k4,') = ', vynMhalf(k4)
write(17,78) k4, rxn(k4)*1.0D9, ryn(k4)*1.0D9, rzn(k4)*1.0D9,
&vxnMhalf(k4), vynMhalf(k4)
60 continue
c Add pause statement to preview initial conditions on screen:
pause
c Calculate some of the quantities that will be used in the van Gunsteren
c and Berendsen algorithm.
c
gdt = gamma*DeltaT
gdthalf = gdt/2.0D0
Cgdthalf = gdt - 3.0D0 + 4.0D0*(dexp(-gdthalf)) - dexp(-gdt)
Dgdthalf = 2.0D0 - dexp(gdthalf) - dexp(-gdthalf)
Bgdthalf = gdt*(dexp(gdt) - 1.0D0) - 4.0D0*(dexp(gdthalf) -
&1.0D0)**2.0D0
BMgdthalf = gdt*(-dexp(gdt) - 1.0D0) - 4.0D0*(dexp(-gdthalf) -
&1.0D0)**2.0D0
DMgdthalf = 2.0D0 - dexp(-gdthalf) - dexp(gdthalf)
eq318 = ktimeT*Cgdthalf/(mass*gamma**2.0D0)
93
SDeq318 = dsqrt(eq318)
eq321 = ktimeT*Bgdthalf/(mass*Cgdthalf)
SDeq321 = dsqrt(eq321)
eq329 = ktimeT*(1.0D0 - dexp(-gdt))/mass
SDeq329 = dsqrt(eq329)
eq332 = ktimeT*BMgdthalf/(mass*(dexp(-gdt) - 1.0D0)*
&gamma**2.0D0)
SDeq332 = dsqrt(eq332)
c Print quantities obtained above and pause to check results:
print*, 'gdt = ', gdt
print*, 'gdthalf = ', gdthalf
print*, 'Bgdthalf = ', Bgdthalf
print*, 'Cgdthalf = ', Cgdthalf
print*, 'Dgdthalf = ', Dgdthalf
print*, 'BMgdthalf = ', BMgdthalf
print*, 'DMgdthalf = ', DMgdthalf
print*, 'eq318 = ', eq318
print*, 'SDeq318 = ', SDeq318
print*, 'eq321 = ', eq321
print*, 'SDeq321 = ', SDeq321
print*, 'eq329 = ', eq329
print*, 'SDeq329 = ', SDeq329
print*, 'eq332 = ', eq332
print*, 'SDeq332 = ', SDeq332
pause
c
c Calculate initial values for xXnMhalf(N), yXnMhalf(N):
c
do 11 k3 = 1,N
xXnMhalf(k3) = FlucF(SDeq318, idum)
yXnMhalf(k3) = FlucF(SDeq318, idum)
11 continue
c
c Write initial positions and velocities to screen and to fort.18 file:
c
write(*,77) time, (rxn(k1), ryn(k1), rzn(k1), vxnMhalf(k1),
&vynMhalf(k1), k1=1,N)
77 format (' ', 350(1p1e15.6))
write(18,*) 'time ','aveX ','aveY ','aveZ ','Tvx ','Tvy ',
&'TFx ', 'TFy ', 'TKinetic ',
&'TPoten ','TForce ', 'Tvel ', 'TEnrgy '
c
c Purpose of outer do-loop is to print out the results to the screen
c after "nsnaps" nsec have elapsed.
c
do 41 l2 = 1, ltime, 1
c
c Inner do-loop calculates positions and velocities for "nsnaps" nsec.
c
c
do 42 l1 = 1, nsnaps, 1
94
c Enter do loop to update forces for all particles.
c Reset Total Energy, Total/Net Force (all particles), Total/Net
c velocity (all particles), Total Kinetic/Potential Energies,
c Total (sum of) Forces, and Total (sum of) velocities at 0.0
c prior to entering this do loop.
c
TEnrgy = 0.0D0
TForce = 0.0D0
Tvel = 0.0D0
TKinetic = 0.0D0
TPoten = 0.0D0
TFx = 0.0D0
TFy = 0.0D0
Tvx = 0.0D0
Tvy = 0.0D0
do 3 j1 = 1, N, 1
c Initialize values of forces, potential energy, and kinetic
c energy at 0.0 before entering inner do loop:
Fn(j1) = 0.0D0
Fxn(j1) = 0.0D0
Fyn(j1) = 0.0D0
T(j1) = 0.0D0
V(j1) = 0.0D0
do 8 j2 = 1, N, 1
if (j1.eq.j2) goto 8
distx = rxn(j2) - rxn(j1)
disty = ryn(j2) - ryn(j1)
call sep(distx, disty, size)
dist = dsqrt(distx**2.0D0 + disty**2.0D0)
Fn(j1) = LJForce(dist, sigma, eps)
c Fn(j1) = 0.0D0
Fxn(j1) = Fxn(j1) + Fn(j1)*(distx/dist)
Fyn(j1) = Fyn(j1) + Fn(j1)*(disty/dist)
V(j1) = V(j1) + LJnrg(dist,sigma,eps)
c V(j1) = V(j1) + 0.0D0
8 continue
3 continue
c Calculate half step velocities and new value of position. Comments
c in the following do-loop describe several interim steps.
do 15 k3 = 1,N
c
c Sample values of xYv(N) and yYv(N) from a Gaussian
c distribution, and then calculate xVnMhalf(N) and
c yVnMhalf(N) per step 3, page 180, of paper.
c
xYv(k3) = FlucF(SDeq321, idum)
xVnMhalf(k3) = xXnMhalf(k3)*gamma*Dgdthalf/Cgdthalf + xYv(k3)
yYv(k3) = FlucF(SDeq321, idum)
yVnMhalf(k3) = yXnMhalf(k3)*gamma*Dgdthalf/Cgdthalf + yYv(k3)
c
95
c Sample values of xVnhalf(N) and yVnhalf(N) from a
c Gaussian distribution, and then calculate the half-step velocities
c from equation 3.6:
c
xVnhalf(k3) = FlucF(SDEq329, idum)
vxnPhalf(k3) = vxnMhalf(k3)*dexp(-gdt) + Fxn(k3)*DeltaT*
&(1.0D0 - dexp(-gdt))/(mass*gdt) + xVnhalf(k3) - dexp(-gdt)*
&xVnMhalf(k3)
yVnhalf(k3) = FlucF(SDEq329, idum)
vynPhalf(k3) = vynMhalf(k3)*dexp(-gdt) + Fyn(k3)*DeltaT*
&(1.0D0 - dexp(-gdt))/(mass*gdt) + yVnhalf(k3) - dexp(-gdt)*
&yVnMhalf(k3)
c
c Finally, xYx(N) and yYx(N) are sampled from Gaussian
c distributions. Then the random variables xXneghalf(N) and
c yXneghalf(N) are calculated. xXhalf(N) and yXhalf(N)
c are sampled from Gaussian distributions. From all of these
c variables, the positions at the next step are calculated.
c
xYx(k3) = FlucF(SDeq332, idum)
xXneghalf(k3) = xVnhalf(k3)*DMgdthalf/(gamma*(dexp(-gdt) -
&1.0D0)) + xYx(k3)
xXhalf(k3) = FlucF(SDeq318, idum)
rxnp1(k3) = rxn(k3) + vxnPhalf(k3)*DeltaT*(dexp(gdthalf) -
&dexp(-gdthalf))/gdt + xXhalf(k3)
& - xXneghalf(k3)
yYx(k3) = FlucF(SDeq332, idum)
yXneghalf(k3) = yVnhalf(k3)*DMgdthalf/(gamma*(dexp(-gdt) -
&1.0D0)) + yYx(k3)
yXhalf(k3) = FlucF(SDeq318, idum)
rynp1(k3) = ryn(k3) + vynPhalf(k3)*DeltaT*(dexp(gdthalf) -
&dexp(-gdthalf))/gdt + yXhalf(k3)
& - yXneghalf(k3)
c
c Print interim values to screen as desired for troubleshooting:
c
c print*, 'xYv(',k3,') = ',xYv(k3)
c print*, 'xVnMhalf(',k3,') = ',xVnMhalf(k3)
c print*, 'xVnhalf(',k3,') = ',xVnhalf(k3)
c print*, 'vxnPhalf(',k3,') = ',vxnPhalf(k3)
c print*, 'xYx(',k3,') = ',xYx(k3)
c print*, 'xXneghalf(',k3,') = ',xXneghalf(k3)
c print*, 'xXhalf(',k3,') = ',xXhalf(k3)
c print*, 'rxnp1(',k3,') = ',rxnp1(k3)
c print*, ' '
c print*, 'yYv(',k3,') = ',yYv(k3)
c print*, 'yVnMhalf(',k3,') = ',yVnMhalf(k3)
c print*, 'yVnhalf(',k3,') = ',yVnhalf(k3)
c print*, 'vynPhalf(',k3,') = ',vynPhalf(k3)
c print*, 'yYx(',k3,') = ',yYx(k3)
c print*, 'yXneghalf(',k3,') = ',yXneghalf(k3)
96
c print*, 'yXhalf(',k3,') = ',yXhalf(k3)
c print*, 'rynp1(',k3,') = ',rynp1(k3)
c print*, ' '
c print*, 'zYv(',k3,') = ',zYv(k3)
c print*, 'zVnMhalf(',k3,') = ',zVnMhalf(k3)
c print*, 'zVnhalf(',k3,') = ',zVnhalf(k3)
c print*, 'vznPhalf(',k3,') = ',vznPhalf(k3)
c print*, 'zYx(',k3,') = ',zYx(k3)
c print*, 'zXneghalf(',k3,') = ',zXneghalf(k3)
c print*, 'zXhalf(',k3,') = ',zXhalf(k3)
c print*, 'rznp1(',k3,') = ',rznp1(k3)
c print*, ' '
15 continue
c Pause to preview interim values:
c pause
do 19 k1 = 1,N
c Calculate Final Kinetic energy for each particle, Total
c Kinetic energy of all particles, Total potential energy of all
c particles, Total force (sum of all forces) in x and y directions,
c Total velocity (sum of all velocities) in x and y directions,
c and Total Energy of all particles.
T(k1) = (0.5D0)*mass*(vxnPhalf(k1)**2.0D0 +
&vynPhalf(k1)**2.0D0)
TKinetic = TKinetic + T(k1)
TPoten = TPoten + V(k1)
TFx = TFx + Fxn(k1)
TFy = TFy + Fyn(k1)
Tvx = Tvx + vxnPhalf(k1)
Tvy = Tvy + vynPhalf(k1)
c For now, the following two lines are comment lines. If added back in, the
c lines provide a method to calculate the total energy of each particle, and
c also a different method to calculate total energy.
c Enrgy(k1) = T(k1) + V(k1)
c TEnrgy = TEnrgy + Enrgy(k1)
c
c Check to make sure the newly calculated positions are not outside of the box.
c If they are, use the modulus
c function to bring the particle in at the other side of the box:
if (rxnp1(k1).gt.size) then
rxnp1(k1) = dmod(rxnp1(k1),size)
elseif (rxnp1(k1).lt.0.0D0) then
rxnp1(k1) = rxnp1(k1) + size
endif
if (rynp1(k1).gt.size) then
rynp1(k1) = dmod(rynp1(k1), size)
elseif (rynp1(k1).lt.0.0D0) then
rynp1(k1) = rynp1(k1)+ size
endif
c
c Now, set "final" values equal to "initial" values to be used
97
c during next iteration:
4 rxn(k1) = rxnp1(k1)
ryn(k1) = rynp1(k1)
xXnMhalf(k1) = xXhalf(k1)
yXnMhalf(k1) = yXhalf(k1)
vxnMhalf(k1) = vxnPhalf(k1)
vynMhalf(k1) = vynPhalf(k1)
c print*, 'T(',k1,') = ', T(k1)
19 continue
time = time + DeltaT
42 continue
c
c Calculate total force, net velocity of all particles, and total
c energy for those cases where data is output to screen and fort.10:
TForce = (TFx**2.0D0 + TFy**2.0D0)
Tvel = (Tvx**2.0D0 + Tvy**2.0D0)
TEnrgy = TKinetic + TPoten
c
c Calculate average values of x, y, and z for all particles.
c
aveX = 0.0D0
aveY = 0.0D0
aveZ = 0.0D0
do 1 j1 = 1, N
aveX = aveX + rxn(j1)
aveY = aveY + ryn(j1)
aveZ = aveZ + rzn(j1)
1 continue
aveX = aveX/N
aveY = aveY/N
aveZ = aveZ/N
c Write results to screen:
c
write(*,77) time, aveX, aveY, aveZ, Tvx, Tvy, TFx, TFy,
&TKinetic, TPoten, TForce, Tvel, TEnrgy
c Write same quantities to a fort.18 file. Time in nanoseconds and distance in nanometers.
write(18,77) time*1.0D9, aveX*1.0D9, aveY*1.0D9,
&aveZ*1.0D9, Tvx, Tvy, TFx, TFy, TKinetic, TPoten,
&TForce, Tvel, TEnrgy
41 continue
c Output final x, y, and z coordinates to fort.19 file:
90 do 2 j1 = 1, N
write(19,78) j1, rxn(j1)*1.0D9 ,ryn(j1)*1.0D9, rzn(j1)*1.0D9,
&vxnMhalf(j1), vynMhalf(j1)
2 continue
78 format (' ', i3, 5(1p1e15.6))
return
end
c
c
******************************************************************************
98
c The following function is used to calculate the Lennard-Jones Force.
c
function LJForce(dist, sigma, eps)
real*8 LJForce, dist, sigma, eps
LJForce = dist*((24.0D0*eps/(dist**2.0D0))*
& ((sigma/dist)**6.0D0)*(1.0D0 - 2.0D0*((sigma/dist)**6.0D0)))
return
end
c
c
******************************************************************************
c
c
******************************************************************************
c The following function calculates the Lennard-Jones energy of the dipole
c with respect to another dipole. Typical Lennard-Jones energy is divided in half
c because only half of the energy "belongs" to the particle under consideration. The other
c half "belongs" to the particle it is interacting with.
c
function LJnrg(dist, sigma, eps)
real*8 LJnrg, dist, sigma, eps
LJnrg = 2.0D0*eps*(((sigma/dist)**12.0D0) -((sigma/dist)**6.0D0))
return
end
c
c
******************************************************************************
c
c
******************************************************************************
c The following subroutine ensures that the particles are interacting with the particles that
c are closest to them. Note that sign(A,B) returns the value of A with the sign of B.
c
subroutine sep(distx, disty, size)
real*8 distx, disty, size
if (abs(distx).gt. 0.5D0*size) distx = distx - sign(size,distx)
if (abs(disty).gt. 0.5D0*size) disty = disty - sign(size,disty)
return
end
c
c
******************************************************************************
c
c
******************************************************************************
c The following function calculates a random number on a Gaussian
c distribution with zero mean and with width specified by the standard
c deviation (input to the function).
function FlucF(StdDev, idum)
real*8 ranU(12), ranG, R, a1, a3, a5, a7, a9, StdDev, FlucF
99
real*8 ran2
integer l2, idum
c Set values for polynomial coefficients:
a1 = 3.949846138D0
a3 = 0.252408784D0
a5 = 0.076542912D0
a7 = 0.008355968D0
a9 = 0.029899776D0
c Initialize ranG:
ranG = 0.0D0
do 43 l2 = 1, 12, 1
ranU(l2) = ran2(idum)
ranG = ranG + ranU(l2)
43 continue
R = (ranG - 6.0D0)/4.0D0
ranG = ((((a9*R**2.0D0+a7)*R**2.0D0+a5)*R**2.0D0+a3)*
&R**2.0D0+a1)*R
FlucF = StdDev*ranG
return
end
c
c
******************************************************************************
c
c
******************************************************************************
c This program used a slightly modified version of a random number generation routine
c called “ran2” that was found in NUMERICAL RECIPES IN FORTRAN 77: THE ART
c OF SCIENTIFIC COMPUTING (ISBN 0-521-43064-X). Only the first line of the
c function is provided here. Please consult this reference for full details of random
c number generation algorithms.
c
FUNCTION ran2(idum)
APPENDIX 6
ADDITIONAL FIGURES
This appendix provides supplemental background figures and diagrams for topics
discussed in the main body of this report.
A6.1. Initial Particle Positions for Systems with Various Numbers of Particles
Figure 28. Initial positions for 20 particles. The particles
are shown by balls and the colors are a guide to the eye to
demonstrate the various heights in the z direction.
101
A6.2. Additional Figures Supporting Deposition Time and Rate Analysis
Figure 30. Decrease in zaverage for all particles over time for a system of
20 particles acted upon by Van der Waals substrate force, Lennard-Jones
interparticle force, gravity and viscous and fluctuating forces.
Figure 29. Initial positions for 50 particles. The particles
are shown by balls and the colors are a guide to the eye to
demonstrate the various heights in the z direction.
102
Figure 31. Decrease in zaverage for all particles over time for a system of 80
particles acted upon by Van der Waals substrate force, Lennard-Jones
Interparticle force, gravity and viscous and fluctuating forces.
Figure 32. Percent coverage for a system containing 50 particles.
103
A6.3. Additional Figures Supporting Pattern Formation Analysis
Figure 33. Percent coverage for a system containing 80 particles.
Figure 34. Final positions of particles on substrate for
a 20 particle system acted upon by Lennard-Jones
interparticle forces, viscous, and fluctuating forces.
Particles able to move after reaching substrate. Size
of particle equal to hematite nanoparticle.
104
Figure 35. Final positions of particles on substrate for
a 20 particle system acted upon by Lennard-Jones
interparticle forces, viscous, and fluctuating forces.
Particles able to move after reaching substrate. Size of
particle equal to hematite nanoparticle plus thickness
of ligand shell.
Figure 36. Final positions of particles on substrate for
a 50 particle system acted upon by Lennard-Jones
interparticle forces, viscous, and fluctuating forces.
Particles able to move after reaching substrate. Size of
particle equal to hematite nanoparticle plus thickness
of ligand shell.
105
Figure 37. Final positions of particles on substrate for
a 20 particle system where particles fell under
influence of gravity, Van der Waals substrate force,
Lennard-Jones interparticle forces, viscous, and
fluctuating forces. Particles were locked in place upon
reaching substrate. Size of particle equal to hematite
nanoparticle.
Figure 38. Final positions of particles on substrate for
a 20 particle system where particles fell under
influence of gravity, Van der Waals substrate force,
Lennard-Jones interparticle forces, viscous, and
fluctuating forces. Particles were locked in place
upon reaching substrate. Size of particle equal to
hematite nanoparticle plus thickness of ligand shell.
106
Figure 39. Final positions of particles on substrate for
a 50 particle system where particles fell under
influence of gravity, Van der Waals substrate force,
Lennard-Jones interparticle forces, viscous, and
fluctuating forces. Particles were locked in place upon
reaching substrate. Size of particle equal to hematite
nanoparticle.
Figure 40. Final positions of particles on substrate for
a 50 particle system where particles fell under
influence of gravity, Van der Waals substrate force,
Lennard-Jones interparticle forces, viscous, and
fluctuating forces. Particles were locked in place upon
reaching substrate. Size of particle equal to hematite
nanoparticle plus thickness of ligand shell.
107
Figure 42. Final positions of particles on substrate for
a 80 particle system where particles fell under
influence of gravity, Van der Waals substrate force,
Lennard-Jones interparticle forces, viscous, and
fluctuating forces. Particles were locked in place upon
reaching substrate. Size of particle equal to hematite
nanoparticle plus thickness of ligand shell.
Figure 41. Final positions of particles on substrate for
an 80 particle system where particles fell under
influence of gravity, Van der Waals substrate force,
Lennard-Jones interparticle forces, viscous, and
fluctuating forces. Particles were locked in place upon
reaching substrate. Size of particle equal to hematite
nanoparticle.
APPENDIX 7
DATA SUPPORTING DEPOSITION TIME AND RATE ANALYSES
Tables 6, 7, and 8 show the results of thirty simulations conducted for systems with 20, 50,
and 80 particles, where the particles were able to move along the substrate after deposition. For
each simulation, the average time for all particles to reach the substrate and time constant were
calculated. Times for the first and last particles to reach the substrate were also noted.
We can analyze the results of these sets of simulations statistically by applying the central
limit theorem, which states that—provided the number of samples is large enough—the distribution
of all possible averages should follow a bell-shaped curve. (Rumsey p. 164) Thus, we can find the
mean and standard error (standard deviation of the mean) of the averages in the second column of
these tables and use these values to determine how confident we are in the expected value of the
average time for all particles to reach the substrate. The time constant was also averaged over all
data runs, and the standard error computed. The results of these statistical analyses for systems
with each number of particles are reported at the bottom of each Table. In addition, summaries of
the statistical analyses appear in Tables 9 and 10. Note that better estimates for the average are
attained with greater numbers of simulations. In general, to ensure that the averages fall on a
normal distribution, it is best to conduct approximately 30 experiments. (Rumsey p. 167)
109
Table 6. Deposition time and rate for system with 20 particles. Particles able to move in x and y
directions after reaching substrate.
Data Run Average
Time for All
Particles to
Reach
Substrate
(ns)
Standard
Deviation (ns)
Time for First
Particle to
Reach
Substrate (ns)
Time for Last
Particle to
Reach
Substrate (ns)
Time
Constant
(μs)
1 133,211 122,842 27,146 394,305 149.74
2 131,289 134,914 15,535 548,179 114.12
3 150,873 241,311 8,935 1,036,480 120.77
4 152,813 124,275 15,773 464,329 158.71
5 150,303 149,224 9,598 429,440 157.25
6 171,807 121,668 23,564 436,445 191.92
7 111,949 115,674 8,177 444,586 104.42
8 150,008 128,613 9,416 482,324 165.49
9 162,182 205,933 5,463 845,363 155.18
10 104,651 82,332 15,609 354,516 97.35
11 105,325 95,824 11,197 378,753 105.57
12 133,938 140,360 8,706 559,529 137.42
13 146,435 119,391 6,735 516,646 153.32
14 115,687 117,658 10,877 461,436 106.63
15 108,130 113,129 5,803 496,771 99.03
16 156,002 114,665 7,058 406,257 166.48
17 79,043 61,244 8,463 187,400 84.81
18 156,860 149,064 12,740 647,701 161.73
19 146,966 138,039 19,485 436,722 142.64
20 122,992 144,650 10,436 518,545 114.23
21 176,519 159,827 11,952 548,256 190.42
22 133,498 85,860 9,710 353,230 141.77
23 107,436 98,110 10,937 429,210 114.50
24 154,515 127,126 28,433 475,129 161.97
25 109,149 92,622 12,776 344,230 111.70
26 149,852 154,975 6,661 618,434 154.46
27 141,001 147,050 8,612 500,744 144.46
28 160,143 146,661 12,609 507,248 171.34
29 112,369 97,261 7,843 366,434 116.93
30 87,798 78,772 11,693 302,288 91.36
Mean of All Average Times to Reach Substrate: 134,091 ns
Standard Error of Mean: 25,035 ns
68% Confidence Range (1 standard error): 109,056 ns to 159,126 ns
95% Confidence Range (2 standard errors): 84,021 ns to 184,161 ns
99.7% Confidence Range (3 standard errors): 58,986 ns to 209,196 ns
Mean of Time Constant: 136.19 μs
Standard Error of Mean: 29.74 μs
110
Table 7. Deposition time and rate for system with 50 particles. Particles able to move in x and y
directions after reaching substrate.
Data Run Average
Time for All
Particles to
Reach
Substrate
(ns)
Standard
Deviation (ns)
Time for First
Particle to
Reach
Substrate (ns)
Time for Last
Particle to
Reach
Substrate (ns)
Time
Constant
(μs)
1 137,880 133,740 9,871 573,063 136.54
2 144,236 124,871 5,514 516,637 140.92
3 115,421 93,190 6,722 339,067 115.67
4 124,349 123,687 8,686 503,316 117.24
5 145,188 156,655 5,321 737,550 141.80
6 149,111 161,275 9,782 764,855 135.63
7 168,509 186,144 6,710 750,076 163.36
8 148,535 156,774 7,210 740,926 139.33
9 161,100 165,353 9,438 941,440 158.64
10 140,485 165,310 7,768 783,826 126.10
11 148,220 147,315 5,515 580,910 139.89
12 137,379 150,286 6,644 696,903 123.47
13 137,185 101,476 14,612 383,738 147.64
14 120,933 131,510 12,747 635,945 105.74
15 182,329 178,447 5,376 767,267 178.60
16 160,642 136,323 7,447 443,234 172.04
17 157,905 143,803 9,404 671,212 150.90
18 124,824 103,882 6,935 388,847 130.31
19 146,868 152,391 11,945 653,624 141.77
20 154,383 138,372 8,473 520,605 153.06
21 127,691 160,271 4,524 840,707 113.17
22 157,666 142,582 7,297 640,065 152.81
23 133,115 155,986 8,345 910,932 116.75
24 146,587 131,859 7,939 557,558 147.02
25 136,160 125,717 6,766 534,364 133.67
26 119,824 110,240 5,452 486,281 115.59
27 142,876 127,560 8,274 563,028 143.77
28 130,283 115,693 12,953 443,359 126.74
29 121,160 122,263 10,937 578,449 113.20
30 153,012 190,163 16,618 1,009,965 135.95
Mean of All Average Times to Reach Substrate: 142,462 ns
Standard Error of Mean: 15,760 ns
68% Confidence Range (1 standard error): 126,702 ns to 158,221 ns
95% Confidence Range (2 standard errors): 110,943 ns to 173,981 ns
99.7% Confidence Range (3 standard errors): 95,183 ns to 189,740 ns
Mean of Time Constant: 137.24 μs
Standard Error of Mean: 18.05 μs
111
Table 8. Deposition time and rate for system with 80 particles. Particles able to move in x and y
directions after reaching substrate.
Data Run Average
Time for All
Particles to
Reach
Substrate
(ns)
Standard
Deviation (ns)
Time for First
Particle to
Reach
Substrate (ns)
Time for Last
Particle to
Reach
Substrate (ns)
Time
Constant
(μs)
1 163,661 181,615 7,750 834,680 148.59
2 142,626 157,911 6,936 873,740 128.46
3 181,284 178,413 7,181 730,088 167.50
4 141,298 152,574 8,587 687,891 126.70
5 148,852 139,544 6,129 627,206 149.80
6 139,901 126,603 8,942 742,872 134.12
7 145,546 167,830 9,177 1,035,220 121.45
8 164,851 179,823 10,392 862,319 149.62
9 146,429 129,746 7,537 503,515 142.93
10 140,681 142,552 11,155 736,923 132.47
11 162,444 261,096 6,115 1,852,814 131.81
12 131,128 122,492 8,225 531,419 123.60
13 117,786 119,033 6,370 640,334 106.37
14 150,218 167,563 9,038 740,797 128.26
15 163,118 175,159 5,474 823,895 151.76
16 171,075 222,235 5,496 1,393,243 148.38
17 150,578 182,307 8,003 1,022,739 122.33
18 151,108 184,245 5,327 925,855 125.88
19 161,231 208,034 3,243 1,439,351 137.17
20 178,030 241,338 4,745 1,128,929 143.95
21 160,693 166,589 6,316 884,067 149.66
22 137,838 123,873 10,223 476,609 128.54
23 164,398 176,869 6,397 1,032,575 154.44
24 178,952 180,677 6,571 882,818 162.95
25 160,015 191,816 7,468 923,878 135.92
26 165,711 221,914 8,284 1,212,880 133.33
27 173,103 160,023 5,769 732,431 168.27
28 172,319 168,623 5,983 922,737 164.44
29 160,494 169,608 6,368 785,052 148.19
30 147,856 157,147 6,485 707,519 136.05
Mean of All Average Times to Reach Substrate: 155,774 ns
Standard Error of Mean: 15,107 ns
68% Confidence Range (1 standard error): 140,667 ns to 170,881 ns
95% Confidence Range (2 standard errors): 125,560 ns to 185,988 ns
99.7% Confidence Range (3 standard errors): 110,453 ns to 201,095 ns
Mean of Time Constant: 140.10 μs
Standard Error of Mean: 15.11 μs
112
Table 9. Mean time for all particles to reach substrate in systems with 20, 50, and 80 particles.
Particle
Number
Mean
Time for
All
Particles
to Reach
Substrate
(μs)
Standard
Error
(μs)
68% Confidence
Range
95% Confidence
Range
99.7% Confidence
Range
Min
(μs)
Max
(μs)
Min
(μs)
Max
(μs)
Min
(μs)
Max
(μs)
20 134.1 25.0 109 159 84 184 59 209
50 142.5 15.8 127 158 111 174 95 190
80 155.8 15.1 141 171 126 186 110 201
Table 10. Average time constant for systems with 20, 50, and 80 particles.
Particle Number Average Time Constant (μs) Standard Error (μs)
20 136 30
50 137 18
80 140 15
BIBLIOGRAPHY
Allen, M.P. and D.J. Tildesley. Computer Simulation of Liquids. Oxford: Clarendon Press, 1987.
Allen, Michael P. "Algorithms for brownian dynamics." Molecular Physics: An International
Journal at the Interface Between Chemistry and Physics (1982): pp. 599 - 601.
Bell, G. M., S. Levine and L. N. McCartney. "Approximate Methods of Determining the Double-
Layer Free Energy of Interaction between Two Charged Colloidal Spheres." Journal of
Colloid and Interface Science (1970): pp. 335 - 359.
Chatterjee, Abhijit and Dionisios G. Vlachos. "An overview of spatial microscopic and accelerated
kinetic Monte Carlo methods." Journal of Computer-Aided Materials Design (2007): pp.
253 - 308.
Chen, Jim C. and Albert S. Kim. "Brownian Dynamics, Molecular Dynamics, and Monte Carlo
modeling of colloidal systems." Advances in Colloid and Interface Science (2004): pp. 159
- 173.
Ciccotti, G. and J.P. Ryckaert. "On the Derivation of the Generalized Langevin Equation for
Interacting Brownian Particles." Journal of Statistical Physics (1981): pp. 73 - 82.
de Gennes, P. G. "Polymers at an Interface; a Simplified View." Advances in Colloid and Interface
Science (July 1987): pp. 189 - 209.
"Dynamic Viscosity of Some Common Liquids." n.d. Dynamic Viscosity of Some Common Liquids.
Web. Apr 2014.
Ermak, Donald L. and Helen Buckholz. "Numerical Integration of the Langevin Equation: Monte
Carlo Simulation." Journal of Computational Physics (1980): pp. 169 - 182.
114
Escobar, G. Picasso, et al. "Kinetic study of the combustion of methyl-ethyl ketone over α-hematite
catalyst." Chemical Engineering Journal (2004): pp. 107 - 117.
Faure, Bertrand, German Salazar-Alvarez and Lennart Bergstrom. "Hamaker Constants of Iron
Oxide Nanoparticles." Langmuir (2011): pp. 8659 - 8664.
Giordano, Nicholas J. and Hisao Nakanishi. Computational Physics, Second Edition. Upper Saddle
River: Pearson Education, Inc., 2006.
Gonzalez-Burillo, M., J. Herguido A.L. Barbosa and J. Santamaria. "The influence of the
permeation regime on the activity of catalytic membranes for methane combusion."
Journal of Catalysis (2003): pp. 457 - 459.
Hamaker, H.C. "The London-Van Der Waals Attraction Between Spherical Particles." Physica IV,
no 10 (23 November 1937): pp. 1058 - 1072.
"Hematite." n.d. Mineral Information and Data. Web. 9 Apr 2014.
Hondow, Nicole and Rebecca O. Fuller. "The Use of Preformed Nanoparticles in the Production of
Heterogeneous Catalysts." Journal of Colloid and Interface Science (2014): pp. 396 - 401.
Hsu, M.F., E.R. Dufresne and D.A. Weitz. "Charge Stabilization in Nonpolar Solvents." Langmuir
(2005): pp. 4881 - 4887.
—. "Charge Stabilization in Nonpolar Solvents." Langmuir (2005): pp. 4881 - 4887.
Israelachvili, Jacob N. Intermolecular and Surface Forces, Third Edition. Waltham, MA: Elsevier,
2011.
Jain, Raj. Testing Random Number Generators. Powerpoint Slides. Saint Louis: Washington
University, 2008. Web.
Katzgraber, Helmut G. "Random Numbers in Scientific Computing: An Introduction." 22 May
2010. Web. 16 July 2014.
Kubo, R. "The Fluctuation-Dissipation Theorem." Reports on Progress in Physics (1966): pp. 255
- 284.
115
Lemons, Don S. and Anthony Gythiel. "Paul Langevin’s 1908 paper “On the Theory of Brownian
Motion” [“Sur la théorie du mouvement brownien"] (Translation)." American Journal of
Physics (November 1997): pp. 1079 - 1081.
"Magnetite." n.d. Mineral Information and Data. Web. 17 Sep 2013.
Mandell, M. J. "On the properties of a periodic fluid." Journal of statistical physics (1976): pp. 299
- 305.
Metropolis, Nicholas and S. Ulam. "The Monte Carlo Method." Journal of the American Statistical
Association, Vol 44, No 247 (Sep 1949): pp. 335-341.
Nelson, Philip. Biological Physics: Energy, Information, Life. New York: W.H. Freeman and
Company, 2004. Web.
Pastor, Richard W., Bernard R. Brooks and Attila Szabo. "An analysis of the accuracy of Langevin
and molecular dynamics algorithms." Molecular physics (1988): pp. 1409 - 1419.
Pathria, R.K. and Paul D. Beale. Statistical Mechanics, Third Edition. Oxford; Burlington: Elsevier,
2011.
Picasso, G., et al. "Total combustion of methyl-ethyl ketone over Fe2O3 based catalytic membrane
reactors." Applied Catalysis B: Environmental (2003): pp. 133 - 143.
Pottier, Noelle. Nonequilibrium Statistical Physics: Linear Irreversible Processes. New York:
Oxford University Press, 2009. Web.
Pratt, Lawrence R. and Steven W. Haan. "Effects of periodic boundary conditions on equilibrium
properties of computer simulated fluids. I. Theory." The Journal of Chemical Physics
(1981): pp. 1864 - 1872.
—. "Effects of periodic boundary conditions on equilibrium properties of computer simulated fluids.
II. Application to simple liquids." The Journal of Chemical Physics (1981): pp. 1873 - 1876.
Press, William H., et al. Numerical Recipes in Fortran 77: The Art of Scientific Computing.
Cambridge: Cambridge University Press, 1992. Web.
"Rennet Coagulation of Milk." n.d. Cheese Science. Web. 5 July 2014.
116
Rumsey, Deborah. Statistics for Dummies. Hoboken: Wiley Publishing, Inc., 2003.
Sader, John E., Steven L. Carnie and Derek Y. C. Chan. "Accurate Analytic Formulas for the
Double-Layer Interaction between Spheres." Journal of Colloid and Interface Science
(1995): pp. 46 - 54.
Sandvik, Anders. "Numerical Solutions of Classical Equations of Motion." n.d. Boston University,
Department of Physics, Computational Physics. Web. 16 Oct 2013.
Schuth, F., A. Wingen and J. Sauer. "Oxide Loaded Ordered Mesoporous Oxides for Catalytic
Appications." Microporous and Mesoporous Materials (2001): pp. 465 - 476.
Strobl, Severin and Marcus Bannerman. "High End Simulation in Practice: Molecular Dynamics
Part 1." May 2012. Powerpoint Slides.
Tadmor, Rafael, et al. "Resolving the Puzzle of Ferrofluid Dispersants." Langmuir (2000): pp. 9117
- 9120.
Teja, Amyn S. and Pei-Yoong Koh. "Synthesis, Properties, and Applications of Magnetic Iron
Oxide Nanoparticles." Progress in Crystal Growth and Characterization of Materials
(2009): pp. 22 - 45.
Valle-Delgado, Juan Jose. "Double Layer Forces and DLVO Theory." Autumn 2013. Powerpoint
Slides.
Van Gunsteren, W. F. and H. J. C. Berendsen. "Algorithms for Brownian Dynamics." Molecular
Physics (1982): pp. 637 - 647.
Van Gunsteren, W.F. and H.J.C. Berendsen. "A Leap-frog Algorithm for Stochastic Dynamics."
Molecular Simulation (1988): pp. 173-185.
Verlet, Loup. "Computer "Experiments" on Classical Fluids. I. Thermodynamical Properties of
Lennard-Jones Molecules." Physical Review (5 July 1967): pp. 98 - 103.
Verwey, E.J.W. and J.Th.G. Overbeek. Theory of the Stability of Lyophobic Colloids. New York,
Amsterdam, London, Brussels: Elsevier, 1948.
117
Wang, Ming Chen and G. E. Uhlenbeck. "On the Theory of the Brownian Motion II." Reviews of
Modern Physics (1945): pp. 323 - 342.
Weddemann, Alexander, et al. "Review and Outlook: From Single Nanoparticles to Self-
Assembled Monolayers and Granular GMR Sensors." Beilstein Journal of Nanotechnology
(2010): pp. 75-93.
Xavier, C. Fortran 77 and Numerical Methods. New Delhi: New Age International (P) Ltd.,
Publishers, 1994.