Language: Excel/VisualBasic.
Objective: A program to simulate growth of many polymer chains by free radical polymerization and count chains of given degree of polymerization. A graphical output of the results is available.
Notes: Includes data for experiments with the following monomers: acrylonitrile, methyl methacrylate, styrene, vinyl acetate and vinyl chloride. Data about other or additional monomers can easily incorporated to the program. Termination of the polymerization process can be chosen: by dispropornation or by coupling.
Click here to download the Excel file or use the Visual Basic for Applications listing below.
***** Begin of Program Listing *****
'
' POLYMER DISTRIBUTION EXPERIMENTS
'
' A program to simulate growth of many polymer chains by free
' radical polymerization and count chains of given degree of
' polymerization.
'
' Original Basic Program by L. Oliver Smith, Valparaiso University.
' See Journal of Chemical Education, Sept. 1988, 795-796.
'
'
' Excel/Visual Basic version developed by
' Antonio Augusto Gorni
' São Vicente, Brazil
' www.gorni.eng.br
'
' April 18, 2002
'
Option Explicit
'
' Definition of Global Constants.
'
Public Const gintMaxNo As Integer = 5000
Public Const gintArrMax As Integer = 10000
'
' Defining Global Variables.
'
Public intL As Integer
Public intPolOpt As Integer
Public intMaxNum As Integer
Public intMaxWt As Integer
Public intSample As Integer
Public intXAxisTicksnumber As Integer
Public intYAxisTicksnumber As Integer
Public intXAxisTicksWeight As Single
Public intYAxisTicksWeight As Single
Public sngM0 As Single
Public sngInit As Single
Public sngMonMolWt As Single
Public sngKit As Single
Public sngKpt As Single
Public sngSamplSum(200) As Single
Public sngSmplTotl(200) As Single
Public sngXMinNumber As Single
Public sngXMaxNumber As Single
Public sngYMinNumber As Single
Public sngYMaxnumber As Single
Public sngXMinWeight As Single
Public sngXMaxWeight As Single
Public sngYMinWeight As Single
Public sngYMaxWeight As Single
Public strXAxisLegendNumber As String
Public strYAxisLegendNumber As String
Public strXAxisLegendWeight As String
Public strYAxisLegendWeight As String
Public strPolymer As String
Public strTerm As String
Public strBuffer As String
Dim intQ As Integer
Dim intN As Integer
Dim intSize As Integer
Dim intDP(gintArrMax) As Integer
Dim sngR0 As Single
Dim sngRatio As Single
Dim sngIncrement As Single
Dim sngAvMolWt As Single
Dim sngKinChL As Single
Dim sngChnSum As Single
Dim sngMassUm As Single
Dim boolDone As Boolean
Dim boolTerminate As Boolean
'
' sngM0 > Monomer Concentration
' sngInit > Initiator Concentration
' sngr0 > Free Radical Concentration
' sngRatio > Ratio of Polymerization Rate to Termination Rate
' sngMonMolWt > Molecular Weight of Monomer
' sngKit > Square Root(ki/kt)
' sngKpt > kp/kt
' sngChnSum > Total Number of Chains Formed
' sngMassUm > Total Mass of Polymer
' sngSamplSum > Maximum Number Fraction
' sngSamplTotl > Maximum Weight Fraction
' intSample > Number of Degrees of Polymerization per Sample
' intL > Highest Degree of Polymerization
' sngAvMolWt > Number Average Molecular Weight of Polymer
' sngKinChL > Kinetic Chain Length
'
Sub Auto_Open()
Application.ScreenUpdating = False
Clear
Application.ScreenUpdating = True
End Sub
'
' Introduc Macro:
' Display Basic Info about the Program.
'
Sub Introduc()
Load frmIntroduction
frmIntroduction.Show
Set frmIntroduction = Nothing
End Sub
'
' Input_Data Macro:
' Get data about Polymer and Monomer/Initiator Concentration.
'
Sub Input_Data()
Dim intIJ As Integer
frmPolyData.Show
Set frmPolyData = Nothing
'
' Checks Again If User Gave Up.
'
If intPolOpt = 0 Then Exit Sub
'
' User is Turned On: Program Continues.
' Initializes Variables...
'
For intIJ = 1 To gintArrMax
intDP(intIJ) = 0
Next intIJ
sngR0 = sngKit * Sqr(sngInit)
sngRatio = 0.5 * sngM0 * sngKpt / sngR0
sngRatio = sngRatio / (1# + sngRatio)
intQ = Int((1# + 0.0268 * sngM0 * sngKpt / sngR0) + 0.5)
End Sub
'
' PropagaTd Subroutine:
' Procedure to Simulate Degrees of Polymerization of Polymer Chains
' Based on Relative Probabilities of Propagation and Termination by
' Disproportionation
'
Sub PropagaTd(sngR As Single, intU As Integer)
Dim sngA As Single
intU = 1
boolTerminate = False
Do Until boolTerminate Or (intU = gintArrMax)
sngA = Rnd
If sngA < sngR Then
intU = intU + 1 ' Terminate or grow based on probability
' intU = chain length
Else
boolTerminate = True
End If
Loop
If intU < gintArrMax Then intDP(intU) = intDP(intU) + 1 ' Add 1 to deg. of polym. counter
End Sub
'
' PropagTc Subroutine
'
' Procedure to Simulate Degrees of Polymerization of Polymer Chains
' Based on Relative Probabilities of Propagation and Termination by
' Coupling
'
Sub PropagaTc(sngR As Single, intJ As Integer)
Dim intIncr As Integer
Dim intU As Integer
Dim sngA As Single
Dim intPlen(2) As Integer
For intIncr = 1 To 2
intU = 1
boolTerminate = False
Do Until boolTerminate Or (intU = gintArrMax)
sngA = Rnd
If sngA < sngR Then
intU = intU + 1 ' Terminate or Grow Based on Probability
' intU = growing chain length
Else
boolTerminate = True
End If
Loop
intPlen(intIncr) = intU
Next intIncr
intJ = intPlen(1) + intPlen(2) ' intJ = Coupled Chain Length
If intJ < gintArrMax Then intDP(intJ) = intDP(intJ) + 1 ' Add to Coupled Chain Length Counter}
End Sub
'
' CalculNs Subroutine
'
' Calculates Total Number of Chains Formed, "Mass of Polymer", Maximum
' Number Fraction, Maximum Weight Fraction and Numbers of Degrees of
' Polymerization per Sample
'
Sub CalculNs(sngAvMw As Single, sngSum() As Single, sngTotal() As Single, _
intStep As Integer, intMax1 As Integer, intMax2 As Integer)
Dim intJ As Integer
Dim intK As Integer
Dim intNI As Integer
Dim intTerm As Integer
Dim sngW As Single
Dim intW1(gintArrMax) As Integer
Dim intW2(gintArrMax) As Integer
intMax1 = 1
intMax2 = 1
sngChnSum = 0#
sngMassUm = 0#
For intJ = 1 To intL
sngW = intJ * intDP(intJ) ' Calculate Weight of Polymer Chain Length I
intW1(intJ) = Int(sngW / 30000#)
intW2(intJ) = Int(sngW - Int(intW1(intJ) * 30000#))
sngMassUm = sngMassUm + sngW ' Calculate Total Weight of Polymer
sngChnSum = sngChnSum + intDP(intJ) ' Calculate Total Number of Chains
Next
sngAvMw = sngMassUm / sngChnSum
intTerm = Int(sngAvMw * 5# + 0.5)
sngAvMw = sngAvMw * sngMonMolWt
If intTerm > intL Then intTerm = intL
intStep = (intTerm + 199) \ 200
For intJ = 1 To 200
sngSum(intJ) = 0#
sngTotal(intJ) = 0#
For intNI = 1 To intStep
intK = intStep * (intJ - 1) + intNI
sngSum(intJ) = sngSum(intJ) + intDP(intK) ' Sum Number of Chains in Range
sngTotal(intJ) = sngTotal(intJ) + intW1(intK) * 30000# + intW2(intK) ' Sum Chain Weights in range
Next intNI
If sngSum(intJ) > sngSum(intMax1) Then intMax1 = intJ ' Find Largest Sum of Chains
If sngTotal(intJ) > sngTotal(intMax2) Then intMax2 = intJ ' Find Largest Sum of Weights
Next intJ
For intJ = 1 To 200
sngSum(intJ) = sngSum(intJ) / sngChnSum ' Convert to Fractions
sngTotal(intJ) = sngTotal(intJ) / sngMassUm ' Convert to Fractions
Next intJ
End Sub
'
' Clear Macro:
' Prepares Spreadsheet for New Calculation.
'
Sub Clear()
Dim intCounter As Integer
'
' Clear Graphics.
'
Worksheets("Polymer_Distribution").Activate
If [E10] <> "" Then
Worksheets("Polymer_Graphics").Activate
ActiveSheet.ChartObjects("First Graph").Activate
ActiveChart.ChartArea.Select
ActiveWindow.Visible = False
Selection.Delete
ActiveSheet.ChartObjects("Second Graph").Activate
ActiveChart.ChartArea.Select
ActiveWindow.Visible = False
Selection.Delete
End If
'
' Clear Numerical Data.
'
Worksheets("Polymer_Distribution").Activate
For intCounter = 10 To 22
Cells(intCounter, "E") = ""
Next intCounter
Range("E10").Select
End Sub
'
' Start Macro:
' Executes the Numerical Calculations.
'
Sub Start()
Dim intIJ As Integer
Dim intI As Integer
Dim intAux As Integer
'
' Clear the Results of Previous Calculations.
'
Application.ScreenUpdating = False
Clear
Application.ScreenUpdating = True
Application.ScreenUpdating = False
'
' Data Input Using Forms: Type of Polymerization Reaction.
'
frmPolType.Show
'
' Checks if User Gave Up.
'
If intPolOpt = 0 Then Exit Sub
'
' User is Turned On: Program Continues.
' Data Input.
'
Input_Data
'
' Begin Calculations...
'
Worksheets("Polymer_Distribution").Activate
Select Case intPolOpt
Case 1
intL = 1
Randomize
For intN = 1 To gintMaxNo
PropagaTd sngRatio, intSize ' Build ggintMaxNo of "Polymer Chains"
If intSize > intL Then intL = intSize ' Set l at Largest Chain Length
Next intN
CalculNs sngAvMolWt, sngSamplSum, sngSmplTotl, intSample, intMaxNum, intMaxWt
[E11] = "Disproportionation"
strTerm = "D"
sngKinChL = sngAvMolWt / sngMonMolWt
Case 2
intL = 1
Randomize
For intN = 1 To gintMaxNo
PropagaTc sngRatio, intSize ' Build ggintMaxNo of "Polymer Chains"
If intSize > intL Then intL = intSize ' Set l at Largest Chain Length}
Next intN
CalculNs sngAvMolWt, sngSamplSum, sngSmplTotl, intSample, intMaxNum, intMaxWt
[E11] = "Coupling"
strTerm = "C"
sngKinChL = sngAvMolWt / sngMonMolWt / 2
End Select
'
' Output Numerical Data...
'
[E10] = strPolymer
[E12] = sngM0
[E13] = sngInit
[E14] = sngR0
[E15] = sngChnSum
[E16] = sngMassUm
[E17] = sngSamplSum(intMaxNum)
[E18] = sngSmplTotl(intMaxWt)
[E19] = intSample
[E20] = intL
[E21] = sngAvMolWt
[E22] = sngKinChL
'
' Generates Data for Graphics...
'
Sheets("Graphic_Data").Select
Range("A2:E201").Select
Selection.Clear
For intI = 1 To 200
intAux = intI * intSample
Range("A" & intI + 1) = intI * intSample
Range("B" & intI + 1) = sngSamplSum(intI)
Range("C" & intI + 1) = sngSmplTotl(intI)
If strTerm = "D" Then
Range("D" & intI + 1) = CSng(intSample) * Exp(intAux * Log(sngKinChL / (sngKinChL + 1#))) / sngKinChL
Range("E" & intI + 1) = CSng(intSample) * CSng(intAux) * Exp(intAux * Log(sngKinChL / (sngKinChL + 1#))) / (sngKinChL * sngKinChL)
strBuffer = "Disproportionation"
End If
If strTerm = "C" Then
Range("D" & intI + 1) = CSng(intSample) * CSng(intAux - 1) * Exp(intAux * Log(sngKinChL / (sngKinChL + 1#))) / (sngKinChL * sngKinChL)
Range("E" & intI + 1) = CSng(intSample) * CSng(intAux) * CSng(intAux - 1) * Exp(intAux * Log(sngKinChL / (sngKinChL + 1#))) / (2# * sngKinChL * sngKinChL * sngKinChL)
strBuffer = "Coupling"
End If
Next intI
'
' Plots results...
'
Sheets("Polymer_Graphics").Select
ActiveSheet.ChartObjects.Add(0, 0, 420, 202.5).Select
ActiveSheet.ChartObjects(1).Name = "First Graph"
Application.CutCopyMode = False
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("Graphic_Data").Range( _
"A2:B201,D2:D201"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""Simulated Polymerization"""
ActiveChart.SeriesCollection(2).Name = "=""Theoretical Curve"""
ActiveChart.Location Where:=xlLocationAsObject, Name:="Polymer_Graphics"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = _
"Number Fraction Distribution of D.P. - " + strBuffer
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = _
"Degree of Polymerization - " + strPolymer
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Fraction"
End With
ActiveChart.HasLegend = True
ActiveChart.Legend.Select
Selection.Position = xlBottom
ActiveChart.PlotArea.Select
With Selection.Border
.ColorIndex = 1
.Weight = xlThin
.LineStyle = xlContinuous
End With
Selection.Interior.ColorIndex = xlNone
ActiveChart.Deselect
ActiveSheet.ChartObjects.Add(500, 0, 420, 202.5).Select
ActiveSheet.ChartObjects(2).Name = "Second Graph"
ActiveSheet.ChartObjects("Second Graph").Activate
Application.CutCopyMode = False
ActiveChart.ChartType = xlXYScatter
ActiveChart.SetSourceData Source:=Sheets("Graphic_Data").Range( _
"A2:A201,C2:C201,E2:E201"), PlotBy:=xlColumns
ActiveChart.SeriesCollection(1).Name = "=""Simulated Polymerization"""
ActiveChart.SeriesCollection(2).Name = "=""Theoretical Curve"""
ActiveChart.Location Where:=xlLocationAsObject, Name:="Polymer_Graphics"
With ActiveChart
.HasTitle = True
.ChartTitle.Characters.Text = _
"Weight Fraction Distribution of D.P. - " + strBuffer
.Axes(xlCategory, xlPrimary).HasTitle = True
.Axes(xlCategory, xlPrimary).AxisTitle.Characters.Text = _
"Degree of Polymerization - " + strPolymer
.Axes(xlValue, xlPrimary).HasTitle = True
.Axes(xlValue, xlPrimary).AxisTitle.Characters.Text = "Fraction"
End With
ActiveChart.HasLegend = True
ActiveChart.Legend.Select
Selection.Position = xlBottom
ActiveChart.PlotArea.Select
With Selection.Border
.ColorIndex = 1
.Weight = xlThin
.LineStyle = xlContinuous
End With
Selection.Interior.ColorIndex = xlNone
ActiveChart.Deselect
' ActiveSheet.ChartObjects("First Graph").Select
Range("A1").Select
Worksheets("Polymer_Distribution").Activate
End Sub
***** End of Program Listing ******

Return to the Software Menu.
![]() |
Last Update: 01 April 2004 | |
| © Antonio Augusto Gorni |