Option Compare Database Option Explicit Dim db As DAO.Database Dim rsSeq As Recordset 'Nuclides in order of processing: Heaviest AtWt, then by Rung Dim rsFuels As Recordset 'From 232-Th/fast to 245-Cm/slow Dim TimeStep As Integer 'From 0 to 30 Dim DecaySpan As Double 'Half the span of the TimeStep = 2^TimeStep/2 Dim Fuel As String Dim Speed As String Dim Nuclide As String Private Sub Form_Load() ' Debug.Print "Main form Loaded" End Sub Private Sub Run1_Click() On Error GoTo Bail Dim StrSQL As String Call Initialize For TimeStep = 1 To 2 Debug.Print "Timestep " & TimeStep Fuel = rsFuels.Fields("Fuel") Speed = rsFuels.Fields("Speed") DecaySpan = 2 ^ TimeStep / 2 Call LoadPreviousSnapshot(TimeStep - 1, Fuel, Speed) ' load Buffer for new TimeStep If Speed = "Slow" Then Call ProcessCaptures 'Adjust Old_Inventory in Buffer End If Do While Not rsFuels.EOF Debug.Print "Fuel = " & Fuel & " Speed = " & Speed Do While Not rsSeq.EOF 'Process decays for all nuclides DoEvents Nuclide = rsSeq.Fields("Nuclide") Call DecayAndDistribute(Nuclide) ' Adjust each nuclide for decay rsSeq.MoveNext If Not rsSeq.EOF Then Me.DecayChainCounter.SetFocus Me.DecayChainCounter.Value = rsSeq.Fields("AtWt") End If Loop ' for each Nuclide Call SaveBuffer rsSeq.MoveFirst 'reset Nuclide list rsFuels.MoveNext If Not rsFuels.EOF Then Fuel = rsFuels.Fields("Fuel") Speed = rsFuels.Fields("Speed") Call LoadPreviousSnapshot(TimeStep - 1, Fuel, Speed) ' load Buffer for next Fuel/Speed End If Loop ' until all Fuel/Speed combos processed rsFuels.MoveFirst 'reset fuel/Speed combos list for next TimeStep Next TimeStep MsgBox "Done", , "SimCompletion" Cleanup: rsFuels.Close rsSeq.Close db.Close Set rsFuels = Nothing Set rsSeq = Nothing Set db = Nothing Exit Sub Bail: Resume Cleanup End Sub Private Sub Initialize() DoCmd.SetWarnings False Set db = CurrentDb If DCount("*", "Growth_Buffer") > 0 Then DoCmd.RunSQL ("DELETE * FROM Growth_Buffer") End If If DCount("*", "Will") > 0 Then DoCmd.RunSQL ("DELETE * FROM Will") End If Set rsSeq = db.OpenRecordset("Get_Nuclides_in_Processing_Order") rsSeq.MoveFirst 'Debug.Print rsSeq.Fields("Nuclide") & " is the first decaying nuclide to process" Set rsFuels = db.OpenRecordset("Get_Fuel-Speed_Pairs") rsFuels.MoveFirst 'Debug.Print "First pair is " & rsFuels.Fields("Fuel") & " " & rsFuels.Fields("Speed") End Sub Private Sub LoadPreviousSnapshot(Step As Integer, Fuel As String, Speed As String) Dim StrSQL As String If DCount("*", "Growth_Buffer") > 0 Then DoCmd.RunSQL ("DELETE * FROM Growth_Buffer") End If StrSQL = "INSERT INTO Growth_Buffer (Nuclide, Old_Inventory, Plump_Gain, Plump_Loss, Inherited, New_Inventory) " & _ "SELECT Nuclide, Yield, 0, 0, 0, Yield FROM Snapshots " & _ "WHERE TimeStep = " & Step & " AND Fuel = '" & Fuel & "' AND Speed = '" & Speed & "'" ' Debug.Print StrSQL DoCmd.RunSQL StrSQL End Sub Private Sub ProcessCaptures() Dim StrSQL As String DoCmd.OpenQuery "DecrementGivers" DoCmd.OpenQuery "SupplementTakers" End Sub Private Sub DecayAndDistribute(Parent As String) Dim Halflife As Double Dim OldAtoms As Double Dim Gain As Double Dim Loss As Double Dim Inherited As Double Dim ParentAtoms As Double Dim Decays As Double Dim Protons As Integer Halflife = rsSeq.Fields("HL") OldAtoms = DLookup("Old_Inventory", "Growth_Buffer", "Nuclide = '" & Parent & "'") Gain = DLookup("Plump_Gain", "Growth_Buffer", "Nuclide = '" & Parent & "'") Loss = DLookup("Plump_Loss", "Growth_Buffer", "Nuclide = '" & Parent & "'") Inherited = DLookup("Inherited", "Growth_Buffer", "Nuclide = '" & Parent & "'") ParentAtoms = OldAtoms + Gain - Loss + Inherited If Halflife = 0 Then Decays = ParentAtoms ' Prevents divide by zero error Else Decays = (1 - Exp(-Log(2) * DecaySpan / Halflife)) * ParentAtoms End If If Decays > 0 Then Call AddToDaughters(Parent, Decays) End If Call AddToParent(Parent, ParentAtoms - Decays) End Sub Private Sub AddToDaughters(Parent As String, Estate As Double) Dim StrSQL As String If DCount("*", "Will") > 0 Then DoCmd.RunSQL ("DELETE * FROM Will") End If StrSQL = "INSERT INTO Will(Parent, Estate, Daughter, Pct, Inheritance)" & _ " SELECT '" & Parent & "', " & Estate & ", Daughter, Pct, " & Estate & "*Pct/100 " & _ " FROM Branches WHERE Branches.Nuclide = '" & Parent & "' " DoCmd.RunSQL StrSQL 'Debug.Print "Records in new Will = " & DCount("*", "Will") StrSQL = "UPDATE Growth_Buffer " & _ "INNER JOIN Will ON Will.Daughter = Growth_Buffer.Nuclide " & _ "SET Growth_Buffer.Inherited = Will.Inheritance + Growth_Buffer.Inherited" DoCmd.RunSQL StrSQL End Sub Private Sub AddToParent(Parent As String, Survivors As Double) Dim StrSQL As String StrSQL = "UPDATE Growth_Buffer SET New_Inventory = " & Survivors & " + New_Inventory " & _ " WHERE Nuclide = '" & Parent & "' " 'Debug.Print strSQL DoCmd.RunSQL StrSQL End Sub Private Sub SaveBuffer() Dim StrSQL As String StrSQL = "Insert INTO Snapshots(TimeStep, Fuel, Speed, Nuclide, Yield) " & _ "SELECT " & TimeStep & ", '" & Fuel & "' , '" & Speed & "', Nuclide, New_Inventory " & _ "FROM Growth_Buffer" DoCmd.RunSQL StrSQL 'Debug.Pring strSQL End Sub