From 5518d648185a9e0f3c6acc8dc1e6481b17f4a282 Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Thu, 1 Mar 2018 11:05:21 -0800 Subject: [PATCH 01/14] Moved the function with tuples from modUtility.vb --- HSPEXP/SplashScreen1.vb | 2 +- atcHspfSupport/atcConstituentTables.vb | 34 ++++++++++++++++++++- atcHspfSupport/atcHspfConstituentBalance.vb | 1 + atcHspfSupport/atcHspfConstituentBudget.vb | 32 +++++++++++++++++++ atcHspfSupport/modUtility.vb | 29 ------------------ 5 files changed, 67 insertions(+), 31 deletions(-) diff --git a/HSPEXP/SplashScreen1.vb b/HSPEXP/SplashScreen1.vb index fee7084e4..74799b649 100644 --- a/HSPEXP/SplashScreen1.vb +++ b/HSPEXP/SplashScreen1.vb @@ -27,7 +27,7 @@ ' Version.Text = System.String.Format(Version.Text, My.Application.Info.Version.Major, My.Application.Info.Version.Minor, My.Application.Info.Version.Build, My.Application.Info.Version.Revision) With My.Application.Info.Version - Version.Text = "Version " & .Major & "." & .Minor & " beta7" + Version.Text = "Version " & .Major & "." & .Minor & " beta" If .MajorRevision > 0 OrElse .MinorRevision > 0 Then Version.Text &= "." & .MajorRevision & "." & .MinorRevision End If diff --git a/atcHspfSupport/atcConstituentTables.vb b/atcHspfSupport/atcConstituentTables.vb index 25630eed6..c2998dc51 100644 --- a/atcHspfSupport/atcConstituentTables.vb +++ b/atcHspfSupport/atcConstituentTables.vb @@ -411,7 +411,7 @@ Public Module atcConstituentTables Dim lConversionFactor As Double = 1.0 If aUCI.GlobalBlock.EmFg = 1 Then lUnits = "lbs/ac" - lConversionFactor = 2240 + lConversionFactor = 2000 'English tons to lbs - US needs to move to SI units ElseIf aUCI.GlobalBlock.EmFg = 2 Then lUnits = "kgs/ha" lConversionFactor = 1000 @@ -2383,4 +2383,36 @@ Public Module atcConstituentTables aDataTable.Columns.Add(column) Return aDataTable End Function + Private Function GetGENERSum(ByVal aUCI As HspfUci, ByVal aSource As HspfConnection, ByVal aSDateJ As Double, ByVal aEDateJ As Double) As Tuple(Of Double, Boolean) + Dim aGenerSum As Double = 0 + Dim aGENERID As Integer = aSource.Source.VolId + Dim aGENEROperationisOutputtoWDM As Boolean = False + Dim aGENEROperation As HspfOperation = aSource.Source.Opn + For Each EXTTarget As HspfConnection In aGENEROperation.Targets + If EXTTarget.Target.VolName.Contains("WDM") Then + aGENEROperationisOutputtoWDM = True + Dim lWDMFile As String = EXTTarget.Target.VolName.ToString + Dim lDSN As Integer = EXTTarget.Target.VolId + For i As Integer = 0 To aUCI.FilesBlock.Count + If aUCI.FilesBlock.Value(i).Typ = lWDMFile Then + Dim lFileName As String = AbsolutePath(aUCI.FilesBlock.Value(i).Name.Trim, CurDir()) + Dim lDataSource As atcDataSource = atcDataManager.DataSourceBySpecification(lFileName) + If lDataSource Is Nothing Then + If atcDataManager.OpenDataSource(lFileName) Then + lDataSource = atcDataManager.DataSourceBySpecification(lFileName) + End If + End If + Dim ltimeseries As atcTimeseries = lDataSource.DataSets.FindData("ID", lDSN)(0) + ltimeseries = SubsetByDate(ltimeseries, aSDateJ, aEDateJ, Nothing) + aGenerSum = ltimeseries.Attributes.GetDefinedValue("Sum").Value / YearCount(aSDateJ, aEDateJ) + + End If + Next + End If + Next EXTTarget + + Return New Tuple(Of Double, Boolean)(aGenerSum, aGENEROperationisOutputtoWDM) + End Function + + End Module diff --git a/atcHspfSupport/atcHspfConstituentBalance.vb b/atcHspfSupport/atcHspfConstituentBalance.vb index a0698266b..949e14e07 100644 --- a/atcHspfSupport/atcHspfConstituentBalance.vb +++ b/atcHspfSupport/atcHspfConstituentBalance.vb @@ -365,4 +365,5 @@ Public Module ConstituentBalance Return lReport End Function + End Module diff --git a/atcHspfSupport/atcHspfConstituentBudget.vb b/atcHspfSupport/atcHspfConstituentBudget.vb index 85137af52..89e30bc91 100644 --- a/atcHspfSupport/atcHspfConstituentBudget.vb +++ b/atcHspfSupport/atcHspfConstituentBudget.vb @@ -1718,4 +1718,36 @@ Public Module ConstituentBudget Return MultiFactor End Function + Private Function GetGENERSum(ByVal aUCI As HspfUci, ByVal aSource As HspfConnection, ByVal aSDateJ As Double, ByVal aEDateJ As Double) As Tuple(Of Double, Boolean) + Dim aGenerSum As Double = 0 + Dim aGENERID As Integer = aSource.Source.VolId + Dim aGENEROperationisOutputtoWDM As Boolean = False + Dim aGENEROperation As HspfOperation = aSource.Source.Opn + For Each EXTTarget As HspfConnection In aGENEROperation.Targets + If EXTTarget.Target.VolName.Contains("WDM") Then + aGENEROperationisOutputtoWDM = True + Dim lWDMFile As String = EXTTarget.Target.VolName.ToString + Dim lDSN As Integer = EXTTarget.Target.VolId + For i As Integer = 0 To aUCI.FilesBlock.Count + If aUCI.FilesBlock.Value(i).Typ = lWDMFile Then + Dim lFileName As String = AbsolutePath(aUCI.FilesBlock.Value(i).Name.Trim, CurDir()) + Dim lDataSource As atcDataSource = atcDataManager.DataSourceBySpecification(lFileName) + If lDataSource Is Nothing Then + If atcDataManager.OpenDataSource(lFileName) Then + lDataSource = atcDataManager.DataSourceBySpecification(lFileName) + End If + End If + Dim ltimeseries As atcTimeseries = lDataSource.DataSets.FindData("ID", lDSN)(0) + ltimeseries = SubsetByDate(ltimeseries, aSDateJ, aEDateJ, Nothing) + aGenerSum = ltimeseries.Attributes.GetDefinedValue("Sum").Value / YearCount(aSDateJ, aEDateJ) + + End If + Next + End If + Next EXTTarget + + Return New Tuple(Of Double, Boolean)(aGenerSum, aGENEROperationisOutputtoWDM) + End Function + + End Module diff --git a/atcHspfSupport/modUtility.vb b/atcHspfSupport/modUtility.vb index 5b0c03991..37412691c 100644 --- a/atcHspfSupport/modUtility.vb +++ b/atcHspfSupport/modUtility.vb @@ -2009,34 +2009,5 @@ Public Module Utility Next Return aExitNumber End Function - Public Function GetGENERSum(ByVal aUCI As HspfUci, ByVal aSource As HspfConnection, ByVal aSDateJ As Double, ByVal aEDateJ As Double) As Tuple(Of Double, Boolean) - Dim aGenerSum As Double = 0 - Dim aGENERID As Integer = aSource.Source.VolId - Dim aGENEROperationisOutputtoWDM As Boolean = False - Dim aGENEROperation As HspfOperation = aSource.Source.Opn - For Each EXTTarget As HspfConnection In aGENEROperation.Targets - If EXTTarget.Target.VolName.Contains("WDM") Then - aGENEROperationisOutputtoWDM = True - Dim lWDMFile As String = EXTTarget.Target.VolName.ToString - Dim lDSN As Integer = EXTTarget.Target.VolId - For i As Integer = 0 To aUCI.FilesBlock.Count - If aUCI.FilesBlock.Value(i).Typ = lWDMFile Then - Dim lFileName As String = AbsolutePath(aUCI.FilesBlock.Value(i).Name.Trim, CurDir()) - Dim lDataSource As atcDataSource = atcDataManager.DataSourceBySpecification(lFileName) - If lDataSource Is Nothing Then - If atcDataManager.OpenDataSource(lFileName) Then - lDataSource = atcDataManager.DataSourceBySpecification(lFileName) - End If - End If - Dim ltimeseries As atcTimeseries = lDataSource.DataSets.FindData("ID", lDSN)(0) - ltimeseries = SubsetByDate(ltimeseries, aSDateJ, aEDateJ, Nothing) - aGenerSum = ltimeseries.Attributes.GetDefinedValue("Sum").Value / YearCount(aSDateJ, aEDateJ) - End If - Next - End If - Next EXTTarget - - Return New Tuple(Of Double, Boolean)(aGenerSum, aGENEROperationisOutputtoWDM) - End Function End Module From b7c3af7df288bdb13cdada79e326c8c4f21d4526 Mon Sep 17 00:00:00 2001 From: PaulDudaRESPEC Date: Thu, 1 Mar 2018 15:45:21 -0500 Subject: [PATCH 02/14] HSPEXP and atcHSPFSupport -- changes to do summary reports from GQuals --- HSPEXP/HSPFOutputReports.vb | 33 +- HSPEXP/StartUp.Designer.vb | 339 +++++++++++------- HSPEXP/StartUp.vb | 97 ++++- atcHspfSupport/atcConstituentTables.vb | 79 ++-- atcHspfSupport/atcHspfConstituentBalance.vb | 22 +- .../atcHspfWatershedConstituentBalance.vb | 23 +- atcHspfSupport/atcHspfWatershedSummary.vb | 19 +- atcHspfSupport/modUtility.vb | 57 ++- 8 files changed, 451 insertions(+), 218 deletions(-) diff --git a/HSPEXP/HSPFOutputReports.vb b/HSPEXP/HSPFOutputReports.vb index 55a560443..217090492 100644 --- a/HSPEXP/HSPFOutputReports.vb +++ b/HSPEXP/HSPFOutputReports.vb @@ -91,10 +91,28 @@ Module HSPFOutputReports pConstituents.Add("Heat") End If - - If StartUp.chkFecalColiform.Checked Then - pConstituents.Add("FColi") + If StartUp.chkGQUAL1.Checked Then + pConstituents.Add(StartUp.chkGQUAL1.Text) + End If + If StartUp.chkGQUAL2.Checked Then + pConstituents.Add(StartUp.chkGQUAL2.Text) + End If + If StartUp.chkGQUAL3.Checked Then + pConstituents.Add(StartUp.chkGQUAL3.Text) + End If + If StartUp.chkGQUAL4.Checked Then + pConstituents.Add(StartUp.chkGQUAL4.Text) + End If + If StartUp.chkGQUAL5.Checked Then + pConstituents.Add(StartUp.chkGQUAL5.Text) End If + If StartUp.chkGQUAL6.Checked Then + pConstituents.Add(StartUp.chkGQUAL6.Text) + End If + If StartUp.chkGQUAL7.Checked Then + pConstituents.Add(StartUp.chkGQUAL7.Text) + End If + 'set up the timeseries attributes for statistics atcTimeseriesStatistics.atcTimeseriesStatistics.InitializeShared() @@ -491,8 +509,9 @@ Module HSPFOutputReports lActiveSections.Add("OXRX") lActiveSections.Add("NUTRX") lActiveSections.Add("PLANK") - Case "FColi" - lConstituentName = "FColi" + Case Else + lConstituentName = lConstituent + lConstProperties = Utility.LocateConstituentNames(aHspfUci, lConstituent) lActiveSections.Add("PQUAL") lActiveSections.Add("IQUAL") lActiveSections.Add("GQUAL") @@ -605,8 +624,8 @@ Module HSPFOutputReports Else - Logger.Dbg("The HBN file didn't have any data for the constituent " & lConstituent & " therefore the balance reports for " & - lConstituent & " will not be generated. Make sure that HSPF run completed last time.") + Logger.Dbg("The HBN file didn't have any data for the constituent " & lConstituent & " therefore the balance reports for " & + lConstituent & " will not be generated. Make sure that HSPF run completed last time.") Dim ans As Integer ans = MsgBox("HBN files do not have any data. Constituent Balance reports will not be generated. " & "Did uci file run properly last time?") diff --git a/HSPEXP/StartUp.Designer.vb b/HSPEXP/StartUp.Designer.vb index c6388420f..a853e7b31 100644 --- a/HSPEXP/StartUp.Designer.vb +++ b/HSPEXP/StartUp.Designer.vb @@ -34,17 +34,8 @@ Partial Class StartUp Me.chkAreaReports = New System.Windows.Forms.CheckBox() Me.chkRunHSPF = New System.Windows.Forms.CheckBox() Me.pnlHighlight = New System.Windows.Forms.Panel() - Me.chkWaterBalance = New System.Windows.Forms.CheckBox() - Me.chkSedimentBalance = New System.Windows.Forms.CheckBox() - Me.chkFecalColiform = New System.Windows.Forms.CheckBox() - Me.chkBODBalance = New System.Windows.Forms.CheckBox() - Me.chkTotalPhosphorus = New System.Windows.Forms.CheckBox() - Me.chkTotalNitrogen = New System.Windows.Forms.CheckBox() Me.chkAdditionalgraphs = New System.Windows.Forms.CheckBox() Me.btn_help = New System.Windows.Forms.Button() - Me.GroupBox2 = New System.Windows.Forms.GroupBox() - Me.chkHeat = New System.Windows.Forms.CheckBox() - Me.chkDO = New System.Windows.Forms.CheckBox() Me.cmbUCIPath = New System.Windows.Forms.ComboBox() Me.DateTimePicker1 = New System.Windows.Forms.DateTimePicker() Me.DateTimePicker2 = New System.Windows.Forms.DateTimePicker() @@ -56,9 +47,24 @@ Partial Class StartUp Me.ttHSPEXP = New System.Windows.Forms.ToolTip(Me.components) Me.chkExpertStats = New System.Windows.Forms.CheckBox() Me.chkMultiSim = New System.Windows.Forms.CheckBox() - Me.GroupBox2.SuspendLayout() + Me.chkTotalNitrogen = New System.Windows.Forms.CheckBox() + Me.chkSedimentBalance = New System.Windows.Forms.CheckBox() + Me.chkWaterBalance = New System.Windows.Forms.CheckBox() + Me.chkTotalPhosphorus = New System.Windows.Forms.CheckBox() + Me.chkBODBalance = New System.Windows.Forms.CheckBox() + Me.chkGQUAL1 = New System.Windows.Forms.CheckBox() + Me.chkDO = New System.Windows.Forms.CheckBox() + Me.chkHeat = New System.Windows.Forms.CheckBox() + Me.chkGQUAL2 = New System.Windows.Forms.CheckBox() + Me.chkGQUAL3 = New System.Windows.Forms.CheckBox() + Me.GroupBox2 = New System.Windows.Forms.GroupBox() + Me.chkGQUAL4 = New System.Windows.Forms.CheckBox() + Me.chkGQUAL5 = New System.Windows.Forms.CheckBox() + Me.chkGQUAL6 = New System.Windows.Forms.CheckBox() + Me.chkGQUAL7 = New System.Windows.Forms.CheckBox() Me.GroupBox3.SuspendLayout() Me.Plotting.SuspendLayout() + Me.GroupBox2.SuspendLayout() Me.SuspendLayout() ' 'cmdStart @@ -66,7 +72,7 @@ Partial Class StartUp Me.cmdStart.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.cmdStart.DialogResult = System.Windows.Forms.DialogResult.OK Me.cmdStart.Enabled = False - Me.cmdStart.Location = New System.Drawing.Point(326, 578) + Me.cmdStart.Location = New System.Drawing.Point(326, 594) Me.cmdStart.Name = "cmdStart" Me.cmdStart.Size = New System.Drawing.Size(75, 23) Me.cmdStart.TabIndex = 20 @@ -97,7 +103,7 @@ Partial Class StartUp ' Me.lblRCH.AutoSize = True Me.lblRCH.Enabled = False - Me.lblRCH.Location = New System.Drawing.Point(18, 518) + Me.lblRCH.Location = New System.Drawing.Point(20, 537) Me.lblRCH.MaximumSize = New System.Drawing.Size(500, 0) Me.lblRCH.Name = "lblRCH" Me.lblRCH.Size = New System.Drawing.Size(391, 13) @@ -109,7 +115,7 @@ Partial Class StartUp ' Me.txtRCH.BackColor = System.Drawing.SystemColors.Window Me.txtRCH.Enabled = False - Me.txtRCH.Location = New System.Drawing.Point(23, 542) + Me.txtRCH.Location = New System.Drawing.Point(25, 561) Me.txtRCH.Name = "txtRCH" Me.txtRCH.Size = New System.Drawing.Size(47, 20) Me.txtRCH.TabIndex = 19 @@ -120,7 +126,7 @@ Partial Class StartUp ' Me.lblOutReach2.AutoSize = True Me.lblOutReach2.Enabled = False - Me.lblOutReach2.Location = New System.Drawing.Point(81, 545) + Me.lblOutReach2.Location = New System.Drawing.Point(83, 564) Me.lblOutReach2.MaximumSize = New System.Drawing.Size(400, 0) Me.lblOutReach2.Name = "lblOutReach2" Me.lblOutReach2.Size = New System.Drawing.Size(359, 13) @@ -131,7 +137,7 @@ Partial Class StartUp ' Me.cmdEnd.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.cmdEnd.DialogResult = System.Windows.Forms.DialogResult.Cancel - Me.cmdEnd.Location = New System.Drawing.Point(407, 578) + Me.cmdEnd.Location = New System.Drawing.Point(407, 594) Me.cmdEnd.Name = "cmdEnd" Me.cmdEnd.Size = New System.Drawing.Size(75, 23) Me.cmdEnd.TabIndex = 21 @@ -168,77 +174,11 @@ Partial Class StartUp ' Me.pnlHighlight.BackColor = System.Drawing.Color.Red Me.pnlHighlight.Enabled = False - Me.pnlHighlight.Location = New System.Drawing.Point(17, 538) + Me.pnlHighlight.Location = New System.Drawing.Point(19, 557) Me.pnlHighlight.Name = "pnlHighlight" Me.pnlHighlight.Size = New System.Drawing.Size(58, 28) Me.pnlHighlight.TabIndex = 17 ' - 'chkWaterBalance - ' - Me.chkWaterBalance.AutoSize = True - Me.chkWaterBalance.Enabled = False - Me.chkWaterBalance.Location = New System.Drawing.Point(6, 19) - Me.chkWaterBalance.Name = "chkWaterBalance" - Me.chkWaterBalance.Size = New System.Drawing.Size(55, 17) - Me.chkWaterBalance.TabIndex = 11 - Me.chkWaterBalance.Text = "Water" - Me.chkWaterBalance.UseVisualStyleBackColor = True - ' - 'chkSedimentBalance - ' - Me.chkSedimentBalance.AutoSize = True - Me.chkSedimentBalance.Enabled = False - Me.chkSedimentBalance.Location = New System.Drawing.Point(6, 42) - Me.chkSedimentBalance.Name = "chkSedimentBalance" - Me.chkSedimentBalance.Size = New System.Drawing.Size(70, 17) - Me.chkSedimentBalance.TabIndex = 12 - Me.chkSedimentBalance.Text = "Sediment" - Me.chkSedimentBalance.UseVisualStyleBackColor = True - ' - 'chkFecalColiform - ' - Me.chkFecalColiform.AutoSize = True - Me.chkFecalColiform.Enabled = False - Me.chkFecalColiform.Location = New System.Drawing.Point(248, 65) - Me.chkFecalColiform.Name = "chkFecalColiform" - Me.chkFecalColiform.Size = New System.Drawing.Size(109, 17) - Me.chkFecalColiform.TabIndex = 18 - Me.chkFecalColiform.Text = "Indicator Bacteria" - Me.chkFecalColiform.UseVisualStyleBackColor = True - ' - 'chkBODBalance - ' - Me.chkBODBalance.AutoSize = True - Me.chkBODBalance.Enabled = False - Me.chkBODBalance.Location = New System.Drawing.Point(6, 111) - Me.chkBODBalance.Name = "chkBODBalance" - Me.chkBODBalance.Size = New System.Drawing.Size(80, 17) - Me.chkBODBalance.TabIndex = 15 - Me.chkBODBalance.Text = "BOD-Labile" - Me.chkBODBalance.UseVisualStyleBackColor = True - ' - 'chkTotalPhosphorus - ' - Me.chkTotalPhosphorus.AutoSize = True - Me.chkTotalPhosphorus.Enabled = False - Me.chkTotalPhosphorus.Location = New System.Drawing.Point(6, 88) - Me.chkTotalPhosphorus.Name = "chkTotalPhosphorus" - Me.chkTotalPhosphorus.Size = New System.Drawing.Size(109, 17) - Me.chkTotalPhosphorus.TabIndex = 14 - Me.chkTotalPhosphorus.Text = "Total Phosphorus" - Me.chkTotalPhosphorus.UseVisualStyleBackColor = True - ' - 'chkTotalNitrogen - ' - Me.chkTotalNitrogen.AutoSize = True - Me.chkTotalNitrogen.Enabled = False - Me.chkTotalNitrogen.Location = New System.Drawing.Point(6, 65) - Me.chkTotalNitrogen.Name = "chkTotalNitrogen" - Me.chkTotalNitrogen.Size = New System.Drawing.Size(93, 17) - Me.chkTotalNitrogen.TabIndex = 13 - Me.chkTotalNitrogen.Text = "Total Nitrogen" - Me.chkTotalNitrogen.UseVisualStyleBackColor = True - ' 'chkAdditionalgraphs ' Me.chkAdditionalgraphs.AutoSize = True @@ -262,45 +202,6 @@ Partial Class StartUp Me.btn_help.Text = "Help" Me.btn_help.UseVisualStyleBackColor = True ' - 'GroupBox2 - ' - Me.GroupBox2.Controls.Add(Me.chkHeat) - Me.GroupBox2.Controls.Add(Me.chkDO) - Me.GroupBox2.Controls.Add(Me.chkFecalColiform) - Me.GroupBox2.Controls.Add(Me.chkBODBalance) - Me.GroupBox2.Controls.Add(Me.chkTotalPhosphorus) - Me.GroupBox2.Controls.Add(Me.chkWaterBalance) - Me.GroupBox2.Controls.Add(Me.chkSedimentBalance) - Me.GroupBox2.Controls.Add(Me.chkTotalNitrogen) - Me.GroupBox2.Location = New System.Drawing.Point(18, 343) - Me.GroupBox2.Name = "GroupBox2" - Me.GroupBox2.Size = New System.Drawing.Size(442, 147) - Me.GroupBox2.TabIndex = 10 - Me.GroupBox2.TabStop = False - Me.GroupBox2.Text = "Constituent Balance Reports" - Me.ttHSPEXP.SetToolTip(Me.GroupBox2, "This following reports require binary output to be at a monthly or shorter interv" & - "al.") - ' - 'chkHeat - ' - Me.chkHeat.AutoSize = True - Me.chkHeat.Location = New System.Drawing.Point(248, 42) - Me.chkHeat.Name = "chkHeat" - Me.chkHeat.Size = New System.Drawing.Size(49, 17) - Me.chkHeat.TabIndex = 17 - Me.chkHeat.Text = "Heat" - Me.chkHeat.UseVisualStyleBackColor = True - ' - 'chkDO - ' - Me.chkDO.AutoSize = True - Me.chkDO.Location = New System.Drawing.Point(248, 19) - Me.chkDO.Name = "chkDO" - Me.chkDO.Size = New System.Drawing.Size(111, 17) - Me.chkDO.TabIndex = 16 - Me.chkDO.Text = "Dissolved Oxygen" - Me.chkDO.UseVisualStyleBackColor = True - ' 'cmbUCIPath ' Me.cmbUCIPath.AllowDrop = True @@ -418,13 +319,183 @@ Partial Class StartUp "e, a default specification file will be generated,") Me.chkMultiSim.UseVisualStyleBackColor = True ' + 'chkTotalNitrogen + ' + Me.chkTotalNitrogen.AutoSize = True + Me.chkTotalNitrogen.Enabled = False + Me.chkTotalNitrogen.Location = New System.Drawing.Point(6, 65) + Me.chkTotalNitrogen.Name = "chkTotalNitrogen" + Me.chkTotalNitrogen.Size = New System.Drawing.Size(93, 17) + Me.chkTotalNitrogen.TabIndex = 13 + Me.chkTotalNitrogen.Text = "Total Nitrogen" + Me.chkTotalNitrogen.UseVisualStyleBackColor = True + ' + 'chkSedimentBalance + ' + Me.chkSedimentBalance.AutoSize = True + Me.chkSedimentBalance.Enabled = False + Me.chkSedimentBalance.Location = New System.Drawing.Point(6, 42) + Me.chkSedimentBalance.Name = "chkSedimentBalance" + Me.chkSedimentBalance.Size = New System.Drawing.Size(70, 17) + Me.chkSedimentBalance.TabIndex = 12 + Me.chkSedimentBalance.Text = "Sediment" + Me.chkSedimentBalance.UseVisualStyleBackColor = True + ' + 'chkWaterBalance + ' + Me.chkWaterBalance.AutoSize = True + Me.chkWaterBalance.Enabled = False + Me.chkWaterBalance.Location = New System.Drawing.Point(6, 19) + Me.chkWaterBalance.Name = "chkWaterBalance" + Me.chkWaterBalance.Size = New System.Drawing.Size(55, 17) + Me.chkWaterBalance.TabIndex = 11 + Me.chkWaterBalance.Text = "Water" + Me.chkWaterBalance.UseVisualStyleBackColor = True + ' + 'chkTotalPhosphorus + ' + Me.chkTotalPhosphorus.AutoSize = True + Me.chkTotalPhosphorus.Enabled = False + Me.chkTotalPhosphorus.Location = New System.Drawing.Point(6, 88) + Me.chkTotalPhosphorus.Name = "chkTotalPhosphorus" + Me.chkTotalPhosphorus.Size = New System.Drawing.Size(109, 17) + Me.chkTotalPhosphorus.TabIndex = 14 + Me.chkTotalPhosphorus.Text = "Total Phosphorus" + Me.chkTotalPhosphorus.UseVisualStyleBackColor = True + ' + 'chkBODBalance + ' + Me.chkBODBalance.AutoSize = True + Me.chkBODBalance.Enabled = False + Me.chkBODBalance.Location = New System.Drawing.Point(6, 111) + Me.chkBODBalance.Name = "chkBODBalance" + Me.chkBODBalance.Size = New System.Drawing.Size(80, 17) + Me.chkBODBalance.TabIndex = 15 + Me.chkBODBalance.Text = "BOD-Labile" + Me.chkBODBalance.UseVisualStyleBackColor = True + ' + 'chkGQUAL1 + ' + Me.chkGQUAL1.AutoSize = True + Me.chkGQUAL1.Location = New System.Drawing.Point(246, 19) + Me.chkGQUAL1.Name = "chkGQUAL1" + Me.chkGQUAL1.Size = New System.Drawing.Size(69, 17) + Me.chkGQUAL1.TabIndex = 18 + Me.chkGQUAL1.Text = "GQUAL1" + Me.chkGQUAL1.UseVisualStyleBackColor = True + ' + 'chkDO + ' + Me.chkDO.AutoSize = True + Me.chkDO.Location = New System.Drawing.Point(6, 134) + Me.chkDO.Name = "chkDO" + Me.chkDO.Size = New System.Drawing.Size(111, 17) + Me.chkDO.TabIndex = 16 + Me.chkDO.Text = "Dissolved Oxygen" + Me.chkDO.UseVisualStyleBackColor = True + ' + 'chkHeat + ' + Me.chkHeat.AutoSize = True + Me.chkHeat.Location = New System.Drawing.Point(6, 155) + Me.chkHeat.Name = "chkHeat" + Me.chkHeat.Size = New System.Drawing.Size(49, 17) + Me.chkHeat.TabIndex = 17 + Me.chkHeat.Text = "Heat" + Me.chkHeat.UseVisualStyleBackColor = True + ' + 'chkGQUAL2 + ' + Me.chkGQUAL2.AutoSize = True + Me.chkGQUAL2.Location = New System.Drawing.Point(246, 42) + Me.chkGQUAL2.Name = "chkGQUAL2" + Me.chkGQUAL2.Size = New System.Drawing.Size(69, 17) + Me.chkGQUAL2.TabIndex = 19 + Me.chkGQUAL2.Text = "GQUAL2" + Me.chkGQUAL2.UseVisualStyleBackColor = True + ' + 'chkGQUAL3 + ' + Me.chkGQUAL3.AutoSize = True + Me.chkGQUAL3.Location = New System.Drawing.Point(246, 65) + Me.chkGQUAL3.Name = "chkGQUAL3" + Me.chkGQUAL3.Size = New System.Drawing.Size(69, 17) + Me.chkGQUAL3.TabIndex = 20 + Me.chkGQUAL3.Text = "GQUAL3" + Me.chkGQUAL3.UseVisualStyleBackColor = True + ' + 'GroupBox2 + ' + Me.GroupBox2.Controls.Add(Me.chkGQUAL7) + Me.GroupBox2.Controls.Add(Me.chkGQUAL6) + Me.GroupBox2.Controls.Add(Me.chkGQUAL5) + Me.GroupBox2.Controls.Add(Me.chkGQUAL4) + Me.GroupBox2.Controls.Add(Me.chkGQUAL3) + Me.GroupBox2.Controls.Add(Me.chkGQUAL2) + Me.GroupBox2.Controls.Add(Me.chkHeat) + Me.GroupBox2.Controls.Add(Me.chkDO) + Me.GroupBox2.Controls.Add(Me.chkGQUAL1) + Me.GroupBox2.Controls.Add(Me.chkBODBalance) + Me.GroupBox2.Controls.Add(Me.chkTotalPhosphorus) + Me.GroupBox2.Controls.Add(Me.chkWaterBalance) + Me.GroupBox2.Controls.Add(Me.chkSedimentBalance) + Me.GroupBox2.Controls.Add(Me.chkTotalNitrogen) + Me.GroupBox2.Location = New System.Drawing.Point(18, 343) + Me.GroupBox2.Name = "GroupBox2" + Me.GroupBox2.Size = New System.Drawing.Size(442, 179) + Me.GroupBox2.TabIndex = 10 + Me.GroupBox2.TabStop = False + Me.GroupBox2.Text = "Constituent Balance Reports" + Me.ttHSPEXP.SetToolTip(Me.GroupBox2, "This following reports require binary output to be at a monthly or shorter interv" & + "al.") + ' + 'chkGQUAL4 + ' + Me.chkGQUAL4.AutoSize = True + Me.chkGQUAL4.Location = New System.Drawing.Point(246, 88) + Me.chkGQUAL4.Name = "chkGQUAL4" + Me.chkGQUAL4.Size = New System.Drawing.Size(69, 17) + Me.chkGQUAL4.TabIndex = 21 + Me.chkGQUAL4.Text = "GQUAL4" + Me.chkGQUAL4.UseVisualStyleBackColor = True + ' + 'chkGQUAL5 + ' + Me.chkGQUAL5.AutoSize = True + Me.chkGQUAL5.Location = New System.Drawing.Point(246, 111) + Me.chkGQUAL5.Name = "chkGQUAL5" + Me.chkGQUAL5.Size = New System.Drawing.Size(69, 17) + Me.chkGQUAL5.TabIndex = 22 + Me.chkGQUAL5.Text = "GQUAL5" + Me.chkGQUAL5.UseVisualStyleBackColor = True + ' + 'chkGQUAL6 + ' + Me.chkGQUAL6.AutoSize = True + Me.chkGQUAL6.Location = New System.Drawing.Point(246, 134) + Me.chkGQUAL6.Name = "chkGQUAL6" + Me.chkGQUAL6.Size = New System.Drawing.Size(69, 17) + Me.chkGQUAL6.TabIndex = 23 + Me.chkGQUAL6.Text = "GQUAL6" + Me.chkGQUAL6.UseVisualStyleBackColor = True + ' + 'chkGQUAL7 + ' + Me.chkGQUAL7.AutoSize = True + Me.chkGQUAL7.Location = New System.Drawing.Point(246, 155) + Me.chkGQUAL7.Name = "chkGQUAL7" + Me.chkGQUAL7.Size = New System.Drawing.Size(69, 17) + Me.chkGQUAL7.TabIndex = 24 + Me.chkGQUAL7.Text = "GQUAL7" + Me.chkGQUAL7.UseVisualStyleBackColor = True + ' 'StartUp ' Me.AcceptButton = Me.cmdStart Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font Me.CancelButton = Me.cmdEnd - Me.ClientSize = New System.Drawing.Size(493, 618) + Me.ClientSize = New System.Drawing.Size(493, 634) Me.Controls.Add(Me.chkMultiSim) Me.Controls.Add(Me.chkExpertStats) Me.Controls.Add(Me.Plotting) @@ -449,12 +520,12 @@ Partial Class StartUp Me.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen Me.Text = "HSPEXP+ " Me.TransparencyKey = System.Drawing.SystemColors.ActiveBorder - Me.GroupBox2.ResumeLayout(False) - Me.GroupBox2.PerformLayout() Me.GroupBox3.ResumeLayout(False) Me.GroupBox3.PerformLayout() Me.Plotting.ResumeLayout(False) Me.Plotting.PerformLayout() + Me.GroupBox2.ResumeLayout(False) + Me.GroupBox2.PerformLayout() Me.ResumeLayout(False) Me.PerformLayout() @@ -469,15 +540,8 @@ Partial Class StartUp Friend WithEvents chkAreaReports As System.Windows.Forms.CheckBox Friend WithEvents chkRunHSPF As System.Windows.Forms.CheckBox Friend WithEvents pnlHighlight As System.Windows.Forms.Panel - Friend WithEvents chkWaterBalance As System.Windows.Forms.CheckBox - Friend WithEvents chkSedimentBalance As System.Windows.Forms.CheckBox - Friend WithEvents chkTotalNitrogen As System.Windows.Forms.CheckBox - Friend WithEvents chkTotalPhosphorus As System.Windows.Forms.CheckBox - Friend WithEvents chkBODBalance As System.Windows.Forms.CheckBox - Friend WithEvents chkFecalColiform As System.Windows.Forms.CheckBox Friend WithEvents chkAdditionalgraphs As System.Windows.Forms.CheckBox Friend WithEvents btn_help As System.Windows.Forms.Button - Friend WithEvents GroupBox2 As System.Windows.Forms.GroupBox Friend WithEvents cmbUCIPath As System.Windows.Forms.ComboBox Friend WithEvents DateTimePicker1 As System.Windows.Forms.DateTimePicker Friend WithEvents DateTimePicker2 As System.Windows.Forms.DateTimePicker @@ -489,6 +553,19 @@ Partial Class StartUp Friend WithEvents ttHSPEXP As ToolTip Friend WithEvents chkExpertStats As CheckBox Friend WithEvents chkMultiSim As CheckBox + Friend WithEvents chkTotalNitrogen As CheckBox + Friend WithEvents chkSedimentBalance As CheckBox + Friend WithEvents chkWaterBalance As CheckBox + Friend WithEvents chkTotalPhosphorus As CheckBox + Friend WithEvents chkBODBalance As CheckBox + Friend WithEvents chkGQUAL1 As CheckBox Friend WithEvents chkDO As CheckBox Friend WithEvents chkHeat As CheckBox + Friend WithEvents chkGQUAL2 As CheckBox + Friend WithEvents chkGQUAL3 As CheckBox + Friend WithEvents GroupBox2 As GroupBox + Friend WithEvents chkGQUAL7 As CheckBox + Friend WithEvents chkGQUAL6 As CheckBox + Friend WithEvents chkGQUAL5 As CheckBox + Friend WithEvents chkGQUAL4 As CheckBox End Class diff --git a/HSPEXP/StartUp.vb b/HSPEXP/StartUp.vb index 1d809cf2e..b2d77d408 100644 --- a/HSPEXP/StartUp.vb +++ b/HSPEXP/StartUp.vb @@ -60,7 +60,20 @@ Public Class StartUp lblOutReach2.Enabled = lExists pnlHighlight.Enabled = lExists cmdStart.Enabled = lExists - + chkGQUAL1.Visible = False + chkGQUAL2.Visible = False + chkGQUAL3.Visible = False + chkGQUAL4.Visible = False + chkGQUAL5.Visible = False + chkGQUAL6.Visible = False + chkGQUAL7.Visible = False + chkGQUAL1.Enabled = False + chkGQUAL2.Enabled = False + chkGQUAL3.Enabled = False + chkGQUAL4.Enabled = False + chkGQUAL5.Enabled = False + chkGQUAL6.Enabled = False + chkGQUAL7.Enabled = False Dim lUCI As String = cmbUCIPath.Text @@ -78,6 +91,51 @@ Public Class StartUp DateTimePicker1.Value = System.DateTime.FromOADate(lSDateJ) DateTimePicker2.Value = System.DateTime.FromOADate(lEDateJ - 1) + + 'list of available gquals + If pUci.OpnBlks("RCHRES").Ids(0).TableExists("GQ-QALDATA") Then + chkGQUAL1.Text = pUci.OpnBlks("RCHRES").Ids(0).Tables("GQ-QALDATA").ParmValue("GQID") + chkGQUAL1.Tag = pUci.OpnBlks("RCHRES").Ids(0).Tables("GQ-QALDATA").ParmValue("QTYID") + chkGQUAL1.Enabled = True + chkGQUAL1.Visible = True + End If + If pUci.OpnBlks("RCHRES").Ids(0).TableExists("GQ-QALDATA:2") Then + chkGQUAL2.Text = pUci.OpnBlks("RCHRES").Ids(0).Tables("GQ-QALDATA:2").ParmValue("GQID") + chkGQUAL2.Tag = pUci.OpnBlks("RCHRES").Ids(0).Tables("GQ-QALDATA:2").ParmValue("QTYID") + chkGQUAL2.Enabled = True + chkGQUAL2.Visible = True + End If + If pUci.OpnBlks("RCHRES").Ids(0).TableExists("GQ-QALDATA:3") Then + chkGQUAL3.Text = pUci.OpnBlks("RCHRES").Ids(0).Tables("GQ-QALDATA:3").ParmValue("GQID") + chkGQUAL3.Tag = pUci.OpnBlks("RCHRES").Ids(0).Tables("GQ-QALDATA:3").ParmValue("QTYID") + chkGQUAL3.Enabled = True + chkGQUAL3.Visible = True + End If + If pUci.OpnBlks("RCHRES").Ids(0).TableExists("GQ-QALDATA:4") Then + chkGQUAL4.Text = pUci.OpnBlks("RCHRES").Ids(0).Tables("GQ-QALDATA:4").ParmValue("GQID") + chkGQUAL4.Tag = pUci.OpnBlks("RCHRES").Ids(0).Tables("GQ-QALDATA:4").ParmValue("QTYID") + chkGQUAL4.Enabled = True + chkGQUAL4.Visible = True + End If + If pUci.OpnBlks("RCHRES").Ids(0).TableExists("GQ-QALDATA:5") Then + chkGQUAL5.Text = pUci.OpnBlks("RCHRES").Ids(0).Tables("GQ-QALDATA:5").ParmValue("GQID") + chkGQUAL5.Tag = pUci.OpnBlks("RCHRES").Ids(0).Tables("GQ-QALDATA:5").ParmValue("QTYID") + chkGQUAL5.Enabled = True + chkGQUAL5.Visible = True + End If + If pUci.OpnBlks("RCHRES").Ids(0).TableExists("GQ-QALDATA:6") Then + chkGQUAL6.Text = pUci.OpnBlks("RCHRES").Ids(0).Tables("GQ-QALDATA:6").ParmValue("GQID") + chkGQUAL6.Tag = pUci.OpnBlks("RCHRES").Ids(0).Tables("GQ-QALDATA:6").ParmValue("QTYID") + chkGQUAL6.Enabled = True + chkGQUAL6.Visible = True + End If + If pUci.OpnBlks("RCHRES").Ids(0).TableExists("GQ-QALDATA:7") Then + chkGQUAL7.Text = pUci.OpnBlks("RCHRES").Ids(0).Tables("GQ-QALDATA:7").ParmValue("GQID") + chkGQUAL7.Tag = pUci.OpnBlks("RCHRES").Ids(0).Tables("GQ-QALDATA:7").ParmValue("QTYID") + chkGQUAL7.Enabled = True + chkGQUAL7.Visible = True + End If + Catch ex As Exception Logger.Msg("HSPEXP+ had trouble opening " & lUCI, MsgBoxStyle.Critical, "UCI Reading Issue!") pUci = Nothing @@ -99,13 +157,20 @@ Public Class StartUp End Sub - Private Sub chkConstituentReportChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkWaterBalance.CheckedChanged, chkSedimentBalance.CheckedChanged, chkTotalNitrogen.CheckedChanged, chkTotalPhosphorus.CheckedChanged, chkBODBalance.CheckedChanged, chkFecalColiform.CheckedChanged + Private Sub chkConstituentReportChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles chkWaterBalance.CheckedChanged, chkSedimentBalance.CheckedChanged, chkTotalNitrogen.CheckedChanged, chkTotalPhosphorus.CheckedChanged, chkBODBalance.CheckedChanged, + chkGQUAL1.CheckedChanged, chkGQUAL2.CheckedChanged, chkGQUAL3.CheckedChanged, chkGQUAL4.CheckedChanged, chkGQUAL5.CheckedChanged, chkGQUAL6.CheckedChanged, chkGQUAL7.CheckedChanged If chkWaterBalance.Checked OrElse chkSedimentBalance.Checked OrElse chkTotalNitrogen.Checked OrElse chkTotalPhosphorus.Checked OrElse chkBODBalance.Checked OrElse - chkFecalColiform.Checked Then + chkGQUAL1.Checked OrElse + chkGQUAL2.Checked OrElse + chkGQUAL3.Checked OrElse + chkGQUAL4.Checked OrElse + chkGQUAL5.Checked OrElse + chkGQUAL6.Checked OrElse + chkGQUAL7.Checked Then lblRCH.Enabled = True lblOutReach2.Enabled = True @@ -193,8 +258,8 @@ Public Class StartUp chkAdditionalgraphs.Checked = False chkBODBalance.Enabled = False chkBODBalance.Checked = False - chkFecalColiform.Checked = False - chkFecalColiform.Enabled = False + chkGQUAL1.Checked = False + chkGQUAL1.Enabled = False chkTotalNitrogen.Enabled = False chkTotalNitrogen.Checked = False chkTotalPhosphorus.Enabled = False @@ -207,6 +272,20 @@ Public Class StartUp chkDO.Enabled = False chkHeat.Checked = False chkHeat.Enabled = False + chkGQUAL1.Checked = False + chkGQUAL2.Checked = False + chkGQUAL3.Checked = False + chkGQUAL4.Checked = False + chkGQUAL5.Checked = False + chkGQUAL6.Checked = False + chkGQUAL7.Checked = False + chkGQUAL1.Enabled = False + chkGQUAL2.Enabled = False + chkGQUAL3.Enabled = False + chkGQUAL4.Enabled = False + chkGQUAL5.Enabled = False + chkGQUAL6.Enabled = False + chkGQUAL7.Enabled = False txtRCH.Enabled = False Else @@ -216,13 +295,19 @@ Public Class StartUp chkReganGraphs.Enabled = True chkAdditionalgraphs.Enabled = True chkBODBalance.Enabled = True - chkFecalColiform.Enabled = True chkTotalNitrogen.Enabled = True chkTotalPhosphorus.Enabled = True chkWaterBalance.Enabled = True chkSedimentBalance.Enabled = True chkDO.Enabled = True chkHeat.Enabled = True + chkGQUAL1.Enabled = True + chkGQUAL2.Enabled = True + chkGQUAL3.Enabled = True + chkGQUAL4.Enabled = True + chkGQUAL5.Enabled = True + chkGQUAL6.Enabled = True + chkGQUAL7.Enabled = True End If diff --git a/atcHspfSupport/atcConstituentTables.vb b/atcHspfSupport/atcConstituentTables.vb index c2998dc51..cd86b4473 100644 --- a/atcHspfSupport/atcConstituentTables.vb +++ b/atcHspfSupport/atcConstituentTables.vb @@ -705,7 +705,9 @@ Public Module atcConstituentTables If lConnection.Target.VolName = "RCHRES" Then Dim aReach As HspfOperation = aUCI.OpnBlks("RCHRES").OperFromID(lConnection.Target.VolId) Dim aConversionFactor As Double = 0.0 - aConversionFactor = ConversionFactorfromOxygen(aUCI, constituent.ReportType, aReach) + If aBalanceType = "TotalN" Or aBalanceType = "TotalP" Then + aConversionFactor = ConversionFactorfromOxygen(aUCI, constituent.ReportType, aReach) + End If Dim lMassLinkID As Integer = lConnection.MassLink If Not lMassLinkID = 0 Then lMassLinkFactor = FindMassLinkFactor(aUCI, lMassLinkID, lOutflowDataType, @@ -882,8 +884,10 @@ Public Module atcConstituentTables Values.Add(foundrow("TotalOutflow")) Next foundrow - lDataForBoxWhiskerPlot.Units = "(" & foundRows(0)("Unit") & "/yr)" - landUseSumAnnualValues.Add(item, Values.ToArray) + If Values.Count > 0 Then + lDataForBoxWhiskerPlot.Units = "(" & foundRows(0)("Unit") & "/yr)" + landUseSumAnnualValues.Add(item, Values.ToArray) + End If Next item lDataForBoxWhiskerPlot.LabelValueCollection = landUseSumAnnualValues CreateGraph_BoxAndWhisker(lDataForBoxWhiskerPlot, aoutfoldername & Constituent.ConstNameForEXPPlus & "_BoxWhisker.png") @@ -902,15 +906,20 @@ Public Module atcConstituentTables For Each MonthRow As DataRow In foundRows Values.Add(MonthRow(month)) Next - landUseSumAnnualValues.Add(Right(month, 3), Values.ToArray) + If Values.Count > 0 Then + landUseSumAnnualValues.Add(Right(month, 3), Values.ToArray) + End If Next lDataForBoxWhiskerPlot.LabelValueCollection = landUseSumAnnualValues - lDataForBoxWhiskerPlot.Units = "(" & foundRows(0)("Unit") & ")" + + If landUseSumAnnualValues.Count > 0 Then + lDataForBoxWhiskerPlot.Units = "(" & foundRows(0)("Unit") & ")" - CreateGraph_BoxAndWhisker(lDataForBoxWhiskerPlot, AbsolutePath(System.IO.Path.Combine("MonthlyLoadings\" & Constituent.ConstNameForEXPPlus & "_" & item.Split(":")(0) & "_" & item.Split(":")(1) & "_BoxWhisker.png"), aoutfoldername), - "Monthly Loading Rate from Land Use " & item & "") - landUseSumAnnualValues.Clear() + CreateGraph_BoxAndWhisker(lDataForBoxWhiskerPlot, AbsolutePath(System.IO.Path.Combine("MonthlyLoadings\" & Constituent.ConstNameForEXPPlus & "_" & item.Split(":")(0) & "_" & item.Split(":")(1) & "_BoxWhisker.png"), aoutfoldername), + "Monthly Loading Rate from Land Use " & item & "") + landUseSumAnnualValues.Clear() + End If @@ -931,35 +940,39 @@ Public Module atcConstituentTables For Each foundrow As DataRow In foundRows Values.Add(foundrow("TotalOutflow")) Next foundrow - landUseSumAnnualValues.Add(item, Values.ToArray) + If Values.Count > 0 Then + landUseSumAnnualValues.Add(item, Values.ToArray) + End If Next item - lDataForBoxWhiskerPlot.Units = "(" & lUnits & "/yr)" - lDataForBoxWhiskerPlot.LabelValueCollection = landUseSumAnnualValues - CreateGraph_BoxAndWhisker(lDataForBoxWhiskerPlot, aoutfoldername & aBalanceType & "_BoxWhisker.png") - landUseSumAnnualValues.Clear() - - - lDataForBoxWhiskerPlot.Constituent = aBalanceType - For Each item As String In listLanduses - Dim OpType1 As String = item.Split("-")(0) - Dim SelectExpression As String = "OpTypeNumber Like '" & item.Split(":")(0) & "%' And OpDesc ='" & item.Split(":")(1) & "'" - Dim foundRows() As DataRow = Land_Constituent_Monthly_Table.Select(SelectExpression) - - For Each month As String In lMonthNames - Dim Values As New List(Of Double) - For Each MonthRow As DataRow In foundRows - Values.Add(MonthRow(month)) + If landUseSumAnnualValues.Count > 0 Then + lDataForBoxWhiskerPlot.Units = "(" & lUnits & "/yr)" + lDataForBoxWhiskerPlot.LabelValueCollection = landUseSumAnnualValues + CreateGraph_BoxAndWhisker(lDataForBoxWhiskerPlot, aoutfoldername & aBalanceType & "_BoxWhisker.png") + landUseSumAnnualValues.Clear() + + + lDataForBoxWhiskerPlot.Constituent = aBalanceType + For Each item As String In listLanduses + Dim OpType1 As String = item.Split("-")(0) + Dim SelectExpression As String = "OpTypeNumber Like '" & item.Split(":")(0) & "%' And OpDesc ='" & item.Split(":")(1) & "'" + Dim foundRows() As DataRow = Land_Constituent_Monthly_Table.Select(SelectExpression) + + For Each month As String In lMonthNames + Dim Values As New List(Of Double) + For Each MonthRow As DataRow In foundRows + Values.Add(MonthRow(month)) + Next + landUseSumAnnualValues.Add(Right(month, 3), Values.ToArray) Next - landUseSumAnnualValues.Add(Right(month, 3), Values.ToArray) - Next - lDataForBoxWhiskerPlot.LabelValueCollection = landUseSumAnnualValues - lDataForBoxWhiskerPlot.Units = "(" & lUnits & ")" + lDataForBoxWhiskerPlot.LabelValueCollection = landUseSumAnnualValues + lDataForBoxWhiskerPlot.Units = "(" & lUnits & ")" - CreateGraph_BoxAndWhisker(lDataForBoxWhiskerPlot, AbsolutePath(System.IO.Path.Combine("MonthlyLoadings\" & aBalanceType & "_" & item.Split(":")(0) & "_" & item.Split(":")(1) & "_BoxWhisker.png"), aoutfoldername), - "Monthly Loading Rate from Land Use " & item & "") - landUseSumAnnualValues.Clear() - Next + CreateGraph_BoxAndWhisker(lDataForBoxWhiskerPlot, AbsolutePath(System.IO.Path.Combine("MonthlyLoadings\" & aBalanceType & "_" & item.Split(":")(0) & "_" & item.Split(":")(1) & "_BoxWhisker.png"), aoutfoldername), + "Monthly Loading Rate from Land Use " & item & "") + landUseSumAnnualValues.Clear() + Next + End If End If diff --git a/atcHspfSupport/atcHspfConstituentBalance.vb b/atcHspfSupport/atcHspfConstituentBalance.vb index 949e14e07..214663448 100644 --- a/atcHspfSupport/atcHspfConstituentBalance.vb +++ b/atcHspfSupport/atcHspfConstituentBalance.vb @@ -48,7 +48,7 @@ Public Module ConstituentBalance Dim lReport As New atcReport.ReportText lReport.AppendLine(aScenario & " " & "Annual Loading Rates of " & aBalanceType & " For Each PERLND, and IMPLND, and") - lReport.AppendLine("Annual Loadings of" & aBalanceType & " For Each Reach.") + lReport.AppendLine("Annual Loadings of " & aBalanceType & " For Each Reach.") lReport.AppendLine(" Run Made " & aRunMade) lReport.AppendLine(" " & aUci.GlobalBlock.RunInf.Value) lReport.AppendLine(" " & TimeSpanAsString(aSDateJ, aEDateJ, "Analysis Period: ")) @@ -144,11 +144,16 @@ Public Module ConstituentBalance .Header = aBalanceType & " Balance Report For " & lLocation & " (" & lDesc & ") (lbs/ac)" Case "TotalN_RCHRES", "TotalP_RCHRES", "BOD-Labile_RCHRES" .Header = aBalanceType & " Balance Report For " & lLocation & " (" & lDesc & ") (lbs)" - Case "FColi_PERLND", "FColi_IMPLND" - .Header = aBalanceType & " Balance Report For " & lLocation & " (" & lDesc & ") (10^9 org/ac)" - Case "FColi_RCHRES" - .Header = aBalanceType & " Balance Report For " & lLocation & " (" & lDesc & ") (10^9 org)" - + Case Else + Dim lUnits As String = "QTYID" + If aBalanceType.ToUpper.Contains("F.COLIFORM") Or aBalanceType.ToUpper.StartsWith("BACT") Then 'Assuming this is f.coli or bacteria + lUnits = "10^9 org" + End If + If lOperName = "PERLND" Or lOperName = "IMPLND" Then + .Header = aBalanceType & " Balance Report For " & lLocation & " (" & lDesc & ") (" & lUnits & "/ac)" + ElseIf lOperName = "RCHRES" Then + .Header = aBalanceType & " Balance Report For " & lLocation & " (" & lDesc & ") (" & lUnits & ")" + End If End Select .NumHeaderRows = 1 @@ -246,9 +251,7 @@ Public Module ConstituentBalance End If - - If lConstituentDataName.Contains("F.Coliform") Then 'Assuming that unit of F.Coliform unit is #ORG - + If lConstituentDataName.ToUpper.Contains("F.COLIFORM") Or lConstituentDataName.ToUpper.StartsWith("BACT") Then 'Assuming that unit of F.Coliform unit is #ORG lMult = 1 / 1000000000.0 '10^9 End If @@ -365,5 +368,4 @@ Public Module ConstituentBalance Return lReport End Function - End Module diff --git a/atcHspfSupport/atcHspfWatershedConstituentBalance.vb b/atcHspfSupport/atcHspfWatershedConstituentBalance.vb index 4eb658c7a..ad981a83e 100644 --- a/atcHspfSupport/atcHspfWatershedConstituentBalance.vb +++ b/atcHspfSupport/atcHspfWatershedConstituentBalance.vb @@ -347,12 +347,18 @@ Public Module WatershedConstituentBalance .Header = aBalanceType & " Balance Report For " & lLandUse & " (lbs/ac)" & vbCrLf Case "TotalN_RCHRES", "TotalP_RCHRES", "BOD-Labile_RCHRES" .Header = aBalanceType & " Balance Report For " & lLandUse & " (lbs)" & vbCrLf - Case "FColi_PERLND", "FColi_IMPLND" - .Header = aBalanceType & " Balance Report For " & lLandUse & " (10^9 org/ac)" & vbCrLf - Case "FColi_RCHRES" - .Header = aBalanceType & " Balance Report For " & lLandUse & " (10^9 org)" & vbCrLf - + Case Else + Dim lUnits As String = "QTYID" + If aBalanceType.ToUpper.Contains("F.COLIFORM") Or aBalanceType.ToUpper.StartsWith("FCOLI") Or aBalanceType.ToUpper.StartsWith("BACT") Then 'Assuming this is f.coli or bacteria + lUnits = "10^9 org" + End If + If lOperationType = "PERLND" Or lOperationType = "IMPLND" Then + .Header = aBalanceType & " Balance Report For " & lLandUse & " (" & lUnits & "/ac)" & vbCrLf + ElseIf lOperationType = "RCHRES" Then + .Header = aBalanceType & " Balance Report For " & lLandUse & " (" & lUnits & ")" & vbCrLf + End If End Select + .NumHeaderRows = 2 If lOutletReport And lOperationType <> "RCHRES" Then .NumFields = lLandUseOperations.Count + 2 @@ -473,9 +479,10 @@ Public Module WatershedConstituentBalance End If - If aBalanceType = "FColi" Then + If aBalanceType.ToUpper.Contains("F.COLIFORM") Or aBalanceType.ToUpper.StartsWith("FCOLI") Or aBalanceType.ToUpper.StartsWith("BACT") Then 'Assuming this is f.coli or bacteria lMult = 1 / 1000000000.0 '10^9 End If + Dim lAttribute As atcDefinedValue = Nothing If ConstituentsThatUseLast.Contains(lConstituentDataName) Then 'lAttribute = lTempDataSet.Attributes.GetDefinedValue("Last") @@ -903,7 +910,7 @@ Public Module WatershedConstituentBalance lSummaryReport.AppendLine(Space(lRowIdLength) & vbTab & "tons/ac".PadLeft(12) & vbTab & "tons".PadLeft(12) & vbTab & "tons/ac".PadLeft(12)) - ElseIf aBalanceType = "FColi" Then + ElseIf aBalanceType.ToUpper.Contains("F.COLIFORM") Or aBalanceType.ToUpper.StartsWith("FCOLI") Or aBalanceType.ToUpper.StartsWith("BACT") Then 'Assuming this is f.coli or bacteria lSummaryReport.AppendLine(Space(lRowIdLength) & vbTab & "10^9/ac".PadLeft(12) & vbTab & "10^9".PadLeft(12) & vbTab & "10^9/ac".PadLeft(12)) @@ -936,7 +943,7 @@ Public Module WatershedConstituentBalance ElseIf aBalanceType = "Sediment" Then lSummaryReport.AppendLine(Space(lRowIdLength) & vbTab & "tons".PadLeft(12) & vbTab & "tons/ac".PadLeft(12)) - ElseIf aBalanceType = "FColi" Then + ElseIf aBalanceType.ToUpper.Contains("F.COLIFORM") Or aBalanceType.ToUpper.StartsWith("FCOLI") Or aBalanceType.ToUpper.StartsWith("BACT") Then 'Assuming this is f.coli or bacteria lSummaryReport.AppendLine(Space(lRowIdLength) & vbTab & "10^9/ac".PadLeft(12) & vbTab & "10^9".PadLeft(12)) Else diff --git a/atcHspfSupport/atcHspfWatershedSummary.vb b/atcHspfSupport/atcHspfWatershedSummary.vb index b962df365..ac5e44e0b 100644 --- a/atcHspfSupport/atcHspfWatershedSummary.vb +++ b/atcHspfSupport/atcHspfWatershedSummary.vb @@ -44,12 +44,6 @@ Public Module WatershedSummary lPerlndConstituents.Add("PODOXM") lImplndConstituents.Add("SODOXM") lRchresConstituents.Add("DOXOUTTOT") - Case "FColi" - lPerlndConstituents.Add("POQUAL-F.Coliform") - lImplndConstituents.Add("SOQUAL-F.Coliform") - lUnits = "10^9" - lTotalUnits = lUnits - lRchresConstituents.Add("F.Coliform-TROQAL") Case "Lead" lPerlndConstituents.Add("POQUAL-LEAD") lImplndConstituents.Add("SOQUAL-LEAD") @@ -118,6 +112,19 @@ Public Module WatershedSummary lPerlndConstituents.Add("POQUAL-ZINC") lImplndConstituents.Add("SOQUAL-ZINC") lRchresConstituents.Add("ZINC-TROQAL") + Case Else + lUnits = "QTYID" + If aSummaryType.ToUpper.Contains("F.COLIFORM") Or aSummaryType.ToUpper.StartsWith("FCOLI") Or aSummaryType.ToUpper.StartsWith("BACT") Then 'Assuming this is f.coli or bacteria + lUnits = "10^9 org" + End If + Dim lGQualName As String = aSummaryType + If lGQualName = "FColi" Then + lGQualName = "F.Coliform" + End If + lPerlndConstituents.Add("POQUAL-" & lGQualName) + lImplndConstituents.Add("SOQUAL-" & lGQualName) + lTotalUnits = lUnits + lRchresConstituents.Add(lGQualName & "-TROQAL") End Select Dim lReport As New atcReport.ReportText diff --git a/atcHspfSupport/modUtility.vb b/atcHspfSupport/modUtility.vb index 37412691c..b8c4c7057 100644 --- a/atcHspfSupport/modUtility.vb +++ b/atcHspfSupport/modUtility.vb @@ -267,22 +267,6 @@ Public Module Utility .Add("R:Copper-TROQAL", "Total Cu") End With #End Region -#Region "Case FColi" - Case "FColi" - With lConstituentsToOutput - .Add("P:Header1", "F.Coliform (10^9 org/ac)") - .Add("P:SOQUAL-F.Coliform", " Surface") - .Add("P:IOQUAL-F.Coliform", " Interflow") - .Add("P:AOQUAL-F.Coliform", " Baseflow") - .Add("P:Total3", " Total") - .Add("I:Header2", "F.Coliform (10^9 org/ac)") - .Add("I:SOQUAL-F.Coliform", " ImpervSurf") - .Add("R:Header3", "F.Coliform (10^9 org)") - .Add("R:F.Coliform-TIQAL", " Inflow") - .Add("R:F.Coliform-DDQAL-TOT", " Decay") - .Add("R:F.Coliform-TROQAL", " Outflow") - End With -#End Region #Region "Case N-PQUAL" Case "N-PQUAL" With lConstituentsToOutput @@ -811,6 +795,26 @@ Public Module Utility .Add("R:BODFLUX-TOT", " BODFLUX-Total") .Add("R:BODOUTTOT", " BODOUTTOT") End With +#End Region +#Region "Case Else" + Case Else + Dim lUnits As String = "QTYID" + If aType.ToUpper.Contains("F.COLIFORM") Or aType.ToUpper.StartsWith("BACT") Then 'Assuming this is f.coli or bacteria + lUnits = "10^9 org" + End If + With lConstituentsToOutput + .Add("P:Header1", aType & " (" & lUnits & "/ac)") + .Add("P:SOQUAL-" & aType, " Surface") + .Add("P:IOQUAL-" & aType, " Interflow") + .Add("P:AOQUAL-" & aType, " Baseflow") + .Add("P:Total3", " Total") + .Add("I:Header2", aType & " (" & lUnits & "/ac)") + .Add("I:SOQUAL-" & aType, " ImpervSurf") + .Add("R:Header3", aType & " (" & lUnits & ")") + .Add("R:" & aType & "-TIQAL", " Inflow") + .Add("R:" & aType & "-DDQAL-TOT", " Decay") + .Add("R:" & aType & "-TROQAL", " Outflow") + End With #End Region End Select Return lConstituentsToOutput @@ -1910,6 +1914,19 @@ Public Module Utility QUALNames.ReportType = aBalanceType QUALs.Add(QUALNames) Return QUALs + + Case Else + QUALNames = New ConstituentProperties + QUALNames.ConstNameForEXPPlus = aBalanceType + QUALNames.ConstituentNameInUCI = aBalanceType + If aUCI.GlobalBlock.EmFg = 1 Then + QUALNames.ConstituentUnit = "unk" + Else + QUALNames.ConstituentUnit = "unk" + End If + QUALNames.ReportType = aBalanceType + QUALs.Add(QUALNames) + Return QUALs End Select @@ -1970,7 +1987,7 @@ Public Module Utility lOutflowDataType.Add("AOHT", "AOHT") lOutflowDataType.Add("TotalOutflow", "TotalOutflow") - Case Else + Case "TotalN", "TotalP" If EXPPlusName = "TAM" Then EXPPlusName = "NH3+NH4" lOutflowDataType.Add("WASHQS" & "-" & EXPPlusName, "WASHQS" & "-" & QualityConstituent) lOutflowDataType.Add("SCRQS" & "-" & EXPPlusName, "SCRQS" & "-" & QualityConstituent) @@ -1978,6 +1995,12 @@ Public Module Utility lOutflowDataType.Add("IOQUAL" & "-" & EXPPlusName, "IOQUAL" & "-" & QualityConstituent) lOutflowDataType.Add("AOQUAL" & "-" & EXPPlusName, "AOQUAL" & "-" & QualityConstituent) lOutflowDataType.Add("TotalOutflow" & "-" & EXPPlusName, "TotalOutflow" & "-" & QualityConstituent) + Case Else + 'case for GQuals + 'lOutflowDataType.Add("SOQUAL" & "-" & EXPPlusName, "SOQUAL" & "-" & QualityConstituent) + 'lOutflowDataType.Add("IOQUAL" & "-" & EXPPlusName, "IOQUAL" & "-" & QualityConstituent) + 'lOutflowDataType.Add("AOQUAL" & "-" & EXPPlusName, "AOQUAL" & "-" & QualityConstituent) + 'lOutflowDataType.Add("TotalOutflow" & "-" & EXPPlusName, "TotalOutflow" & "-" & QualityConstituent) End Select From 7295624ecca6cbf698e95fdcccf4325c600f8081 Mon Sep 17 00:00:00 2001 From: PaulDudaRESPEC Date: Thu, 1 Mar 2018 16:43:44 -0500 Subject: [PATCH 03/14] atcHspfSupport -- implement land loadings report and box-whisker plots for gquals --- atcHspfSupport/atcConstituentTables.vb | 12 ++++----- atcHspfSupport/modUtility.vb | 35 ++++++++++++++++++++++---- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/atcHspfSupport/atcConstituentTables.vb b/atcHspfSupport/atcConstituentTables.vb index cd86b4473..7b304b2d8 100644 --- a/atcHspfSupport/atcConstituentTables.vb +++ b/atcHspfSupport/atcConstituentTables.vb @@ -707,14 +707,14 @@ Public Module atcConstituentTables Dim aConversionFactor As Double = 0.0 If aBalanceType = "TotalN" Or aBalanceType = "TotalP" Then aConversionFactor = ConversionFactorfromOxygen(aUCI, constituent.ReportType, aReach) - End If - Dim lMassLinkID As Integer = lConnection.MassLink - If Not lMassLinkID = 0 Then - lMassLinkFactor = FindMassLinkFactor(aUCI, lMassLinkID, lOutflowDataType, + + Dim lMassLinkID As Integer = lConnection.MassLink + If Not lMassLinkID = 0 Then + lMassLinkFactor = FindMassLinkFactor(aUCI, lMassLinkID, lOutflowDataType, constituent.ReportType, aConversionFactor, lMultipleIndex) - Exit For + Exit For + End If End If - End If Next lConnection End If diff --git a/atcHspfSupport/modUtility.vb b/atcHspfSupport/modUtility.vb index b8c4c7057..fcfb2d884 100644 --- a/atcHspfSupport/modUtility.vb +++ b/atcHspfSupport/modUtility.vb @@ -1919,11 +1919,35 @@ Public Module Utility QUALNames = New ConstituentProperties QUALNames.ConstNameForEXPPlus = aBalanceType QUALNames.ConstituentNameInUCI = aBalanceType + + lTableName = "QUAL-PROPS" + Dim lTempQual As String = "" + Dim lUnits As String = "" + If lOper.TableExists(lTableName) Then + lTempQual = Trim(lOper.Tables(lTableName).Parms("QUALID").Value) + If aBalanceType = lTempQual Then + 'found it + lUnits = Trim(lOper.Tables(lTableName).Parms("QTYID").Value) + End If + End If + Do While lUnits.Length = 0 + For lIndex As Integer = 2 To 10 + If lOper.TableExists(lTableName & ":" & lIndex.ToString) Then + lTempQual = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QUALID").Value) + If aBalanceType = lTempQual Then + 'found it + lUnits = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QTYID").Value) + End If + End If + Next + Loop + If aUCI.GlobalBlock.EmFg = 1 Then - QUALNames.ConstituentUnit = "unk" + QUALNames.ConstituentUnit = lUnits & "/ac" Else - QUALNames.ConstituentUnit = "unk" + QUALNames.ConstituentUnit = lUnits & "/ha" End If + QUALNames.ReportType = aBalanceType QUALs.Add(QUALNames) Return QUALs @@ -1998,9 +2022,10 @@ Public Module Utility Case Else 'case for GQuals 'lOutflowDataType.Add("SOQUAL" & "-" & EXPPlusName, "SOQUAL" & "-" & QualityConstituent) - 'lOutflowDataType.Add("IOQUAL" & "-" & EXPPlusName, "IOQUAL" & "-" & QualityConstituent) - 'lOutflowDataType.Add("AOQUAL" & "-" & EXPPlusName, "AOQUAL" & "-" & QualityConstituent) - 'lOutflowDataType.Add("TotalOutflow" & "-" & EXPPlusName, "TotalOutflow" & "-" & QualityConstituent) + lOutflowDataType.Add("SOQO" & "-" & EXPPlusName, "SOQO" & "-" & QualityConstituent) + lOutflowDataType.Add("IOQUAL" & "-" & EXPPlusName, "IOQUAL" & "-" & QualityConstituent) + lOutflowDataType.Add("AOQUAL" & "-" & EXPPlusName, "AOQUAL" & "-" & QualityConstituent) + lOutflowDataType.Add("TotalOutflow" & "-" & EXPPlusName, "TotalOutflow" & "-" & QualityConstituent) End Select From ef1603f6f2fa95f1cbbea8919c1dc014d2c76660 Mon Sep 17 00:00:00 2001 From: PaulDudaRESPEC Date: Fri, 2 Mar 2018 16:09:12 -0500 Subject: [PATCH 04/14] atcHspfSupport -- new function to return user-specified units of a gqual --- atcHspfSupport/atcHspfConstituentBalance.vb | 11 ++-- .../atcHspfWatershedConstituentBalance.vb | 11 ++-- atcHspfSupport/atcHspfWatershedSummary.vb | 4 +- atcHspfSupport/modUtility.vb | 61 ++++++++++++++++--- 4 files changed, 65 insertions(+), 22 deletions(-) diff --git a/atcHspfSupport/atcHspfConstituentBalance.vb b/atcHspfSupport/atcHspfConstituentBalance.vb index 214663448..408b062f8 100644 --- a/atcHspfSupport/atcHspfConstituentBalance.vb +++ b/atcHspfSupport/atcHspfConstituentBalance.vb @@ -43,8 +43,9 @@ Public Module ConstituentBalance Optional ByVal aDecimalPlaces As Integer = 3, Optional ByVal aSignificantDigits As Integer = 5, Optional ByVal aFieldWidth As Integer = 12) As atcReport.IReport - Dim lConstituentsToOutput As atcCollection = ConstituentsToOutput(aBalanceType, aConstProperties) + Dim lUnits As String = GQualUnits(aUci, aBalanceType) 'if not a gqual, will return a blank string + Dim lConstituentsToOutput As atcCollection = ConstituentsToOutput(aBalanceType, aConstProperties, , lUnits) Dim lReport As New atcReport.ReportText lReport.AppendLine(aScenario & " " & "Annual Loading Rates of " & aBalanceType & " For Each PERLND, and IMPLND, and") @@ -145,14 +146,14 @@ Public Module ConstituentBalance Case "TotalN_RCHRES", "TotalP_RCHRES", "BOD-Labile_RCHRES" .Header = aBalanceType & " Balance Report For " & lLocation & " (" & lDesc & ") (lbs)" Case Else - Dim lUnits As String = "QTYID" + Dim lPrefix As String = "" If aBalanceType.ToUpper.Contains("F.COLIFORM") Or aBalanceType.ToUpper.StartsWith("BACT") Then 'Assuming this is f.coli or bacteria - lUnits = "10^9 org" + lPrefix = "10^9 " End If If lOperName = "PERLND" Or lOperName = "IMPLND" Then - .Header = aBalanceType & " Balance Report For " & lLocation & " (" & lDesc & ") (" & lUnits & "/ac)" + .Header = aBalanceType & " Balance Report For " & lLocation & " (" & lDesc & ") (" & lPrefix & lUnits & "/ac)" ElseIf lOperName = "RCHRES" Then - .Header = aBalanceType & " Balance Report For " & lLocation & " (" & lDesc & ") (" & lUnits & ")" + .Header = aBalanceType & " Balance Report For " & lLocation & " (" & lDesc & ") (" & lPrefix & lUnits & ")" End If End Select diff --git a/atcHspfSupport/atcHspfWatershedConstituentBalance.vb b/atcHspfSupport/atcHspfWatershedConstituentBalance.vb index ad981a83e..09f52034c 100644 --- a/atcHspfSupport/atcHspfWatershedConstituentBalance.vb +++ b/atcHspfSupport/atcHspfWatershedConstituentBalance.vb @@ -263,7 +263,8 @@ Public Module WatershedConstituentBalance lOutletReport = True End If - Dim lConstituentsToOutput As atcCollection = ConstituentsToOutput(aBalanceType, aConstProperties) + Dim lUnits As String = GQualUnits(aUci, aBalanceType) 'if not a gqual, will return a blank string + Dim lConstituentsToOutput As atcCollection = ConstituentsToOutput(aBalanceType, aConstProperties, , lUnits) Logger.Dbg("ConstituentCount:" & lConstituentsToOutput.Count) Dim lConstituentTotals As New atcCollection Dim lConstituentLandUseTotals As New atcCollection @@ -348,14 +349,14 @@ Public Module WatershedConstituentBalance Case "TotalN_RCHRES", "TotalP_RCHRES", "BOD-Labile_RCHRES" .Header = aBalanceType & " Balance Report For " & lLandUse & " (lbs)" & vbCrLf Case Else - Dim lUnits As String = "QTYID" + Dim lPrefix As String = "" If aBalanceType.ToUpper.Contains("F.COLIFORM") Or aBalanceType.ToUpper.StartsWith("FCOLI") Or aBalanceType.ToUpper.StartsWith("BACT") Then 'Assuming this is f.coli or bacteria - lUnits = "10^9 org" + lPrefix = "10^9 " End If If lOperationType = "PERLND" Or lOperationType = "IMPLND" Then - .Header = aBalanceType & " Balance Report For " & lLandUse & " (" & lUnits & "/ac)" & vbCrLf + .Header = aBalanceType & " Balance Report For " & lLandUse & " (" & lPrefix & lUnits & "/ac)" & vbCrLf ElseIf lOperationType = "RCHRES" Then - .Header = aBalanceType & " Balance Report For " & lLandUse & " (" & lUnits & ")" & vbCrLf + .Header = aBalanceType & " Balance Report For " & lLandUse & " (" & lPrefix & lUnits & ")" & vbCrLf End If End Select diff --git a/atcHspfSupport/atcHspfWatershedSummary.vb b/atcHspfSupport/atcHspfWatershedSummary.vb index ac5e44e0b..70600fb9a 100644 --- a/atcHspfSupport/atcHspfWatershedSummary.vb +++ b/atcHspfSupport/atcHspfWatershedSummary.vb @@ -113,9 +113,9 @@ Public Module WatershedSummary lImplndConstituents.Add("SOQUAL-ZINC") lRchresConstituents.Add("ZINC-TROQAL") Case Else - lUnits = "QTYID" + lUnits = GQualUnits(aUci, aSummaryType) If aSummaryType.ToUpper.Contains("F.COLIFORM") Or aSummaryType.ToUpper.StartsWith("FCOLI") Or aSummaryType.ToUpper.StartsWith("BACT") Then 'Assuming this is f.coli or bacteria - lUnits = "10^9 org" + lUnits = "10^9 " & lUnits End If Dim lGQualName As String = aSummaryType If lGQualName = "FColi" Then diff --git a/atcHspfSupport/modUtility.vb b/atcHspfSupport/modUtility.vb index fcfb2d884..8c3020142 100644 --- a/atcHspfSupport/modUtility.vb +++ b/atcHspfSupport/modUtility.vb @@ -135,7 +135,8 @@ Public Module Utility Return pConstituentsThatNeedMassLink End Function Public Function ConstituentsToOutput(ByVal aType As String, ByVal aConstProperties As List(Of ConstituentProperties), - Optional ByVal aCategory As Boolean = False) As atcCollection + Optional ByVal aCategory As Boolean = False, + Optional ByVal aUnits As String = "") As atcCollection Dim lConstituentsToOutput As New atcCollection Select Case aType #Region "Case Water" @@ -589,15 +590,15 @@ Public Module Utility .Add("R:N-TOT-OUT-EXIT5", " Total N OutflowExit5") End With - '.Add("R:TAM-OUTTOT-EXIT3", " Total NH3 Outflow-Exit3") - '.Add("R:TAM-OUTDIS-EXIT3", " Dissolved NH3 Outflow-Exit3") - '.Add("R:TAM-OUTPART-TOT-EXIT3", " Particulate NH3 Outflow-Exit3") + '.Add("R:TAM-OUTTOT-EXIT3", " Total NH3 Outflow-Exit3") + '.Add("R:TAM-OUTDIS-EXIT3", " Dissolved NH3 Outflow-Exit3") + '.Add("R:TAM-OUTPART-TOT-EXIT3", " Particulate NH3 Outflow-Exit3") - '.Add("R:NO3-OUTTOT-EXIT3", " Total NO3 Outflow - Exit 3") + '.Add("R:NO3-OUTTOT-EXIT3", " Total NO3 Outflow - Exit 3") - '.Add("R:N-TOT-OUT-EXIT1", " N-TOT-OUT-EXIT1") - '.Add("R:N-TOT-OUT-EXIT2", " N-TOT-OUT-EXIT2") - '.Add("R:N-TOT-OUT-EXIT3", " N-TOT-OUT-EXIT3") + '.Add("R:N-TOT-OUT-EXIT1", " N-TOT-OUT-EXIT1") + '.Add("R:N-TOT-OUT-EXIT2", " N-TOT-OUT-EXIT2") + '.Add("R:N-TOT-OUT-EXIT3", " N-TOT-OUT-EXIT3") #End Region #Region "Case TotalP" Case "TotalP" @@ -798,9 +799,9 @@ Public Module Utility #End Region #Region "Case Else" Case Else - Dim lUnits As String = "QTYID" + Dim lUnits As String = aUnits If aType.ToUpper.Contains("F.COLIFORM") Or aType.ToUpper.StartsWith("BACT") Then 'Assuming this is f.coli or bacteria - lUnits = "10^9 org" + lUnits = "10^9 " & aUnits End If With lConstituentsToOutput .Add("P:Header1", aType & " (" & lUnits & "/ac)") @@ -2022,6 +2023,8 @@ Public Module Utility Case Else 'case for GQuals 'lOutflowDataType.Add("SOQUAL" & "-" & EXPPlusName, "SOQUAL" & "-" & QualityConstituent) + lOutflowDataType.Add("WASHQS" & "-" & EXPPlusName, "WASHQS" & "-" & QualityConstituent) + lOutflowDataType.Add("SCRQS" & "-" & EXPPlusName, "SCRQS" & "-" & QualityConstituent) lOutflowDataType.Add("SOQO" & "-" & EXPPlusName, "SOQO" & "-" & QualityConstituent) lOutflowDataType.Add("IOQUAL" & "-" & EXPPlusName, "IOQUAL" & "-" & QualityConstituent) lOutflowDataType.Add("AOQUAL" & "-" & EXPPlusName, "AOQUAL" & "-" & QualityConstituent) @@ -2058,4 +2061,42 @@ Public Module Utility Return aExitNumber End Function + Public Function GQualUnits(ByVal aUCI As HspfUci, ByVal aGQualName As String) As String + 'given a uci and gqualname, return the units of the gqual + Dim lUnits As String = "" + + Dim lOper As New HspfOperation + For Each Oper As HspfOperation In aUCI.OpnBlks("RCHRES").Ids + If Oper.Tables("ACTIVITY").Parms("GQALFG").Value = "1" Then + lOper = Oper + 'Find First operation with active GQALFG + Exit For + End If + Next + + If lOper IsNot Nothing Then + Dim lTableName As String = "GQ-QALDATA" + Dim lTempQual As String = "" + If lOper.TableExists(lTableName) Then + lTempQual = Trim(lOper.Tables(lTableName).Parms("GQID").Value) + If aGQualName = lTempQual Then + 'found it + lUnits = Trim(lOper.Tables(lTableName).Parms("QTYID").Value) + End If + End If + Do While lUnits.Length = 0 + For lIndex As Integer = 2 To 10 + If lOper.TableExists(lTableName & ":" & lIndex.ToString) Then + lTempQual = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("GQID").Value) + If aGQualName = lTempQual Then + 'found it + lUnits = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QTYID").Value) + End If + End If + Next + Loop + End If + + Return lUnits + End Function End Module From 175343d3ef2ec0561520bbb76e1fa215efe784ae Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Fri, 2 Mar 2018 17:14:50 -0800 Subject: [PATCH 05/14] Multiple EXP+ UPdates and GQAL 1. Added condition to ignore the loop if operation does not have total TS. 2. Improved GQAL to look for MASS LINK factor when it is simulated as dissolved. 3. Add a digit at the end of GQAL name to indicate its sequence in the UCI file. 4. Ignore other reports for GQAL except land loading reports. They may need more polish. --- HSPEXP/HSPFOutputReports.vb | 20 ++-- atcHspfSupport/atcConstituentTables.vb | 92 ++++++++------- atcHspfSupport/modUtility.vb | 156 ++++++++++++++----------- 3 files changed, 148 insertions(+), 120 deletions(-) diff --git a/HSPEXP/HSPFOutputReports.vb b/HSPEXP/HSPFOutputReports.vb index 217090492..ddde8db75 100644 --- a/HSPEXP/HSPFOutputReports.vb +++ b/HSPEXP/HSPFOutputReports.vb @@ -92,25 +92,25 @@ Module HSPFOutputReports End If If StartUp.chkGQUAL1.Checked Then - pConstituents.Add(StartUp.chkGQUAL1.Text) + pConstituents.Add(StartUp.chkGQUAL1.Text & "-1") End If If StartUp.chkGQUAL2.Checked Then - pConstituents.Add(StartUp.chkGQUAL2.Text) + pConstituents.Add(StartUp.chkGQUAL2.Text & "-2") End If If StartUp.chkGQUAL3.Checked Then - pConstituents.Add(StartUp.chkGQUAL3.Text) + pConstituents.Add(StartUp.chkGQUAL3.Text & "-3") End If If StartUp.chkGQUAL4.Checked Then - pConstituents.Add(StartUp.chkGQUAL4.Text) + pConstituents.Add(StartUp.chkGQUAL4.Text & "-4") End If If StartUp.chkGQUAL5.Checked Then - pConstituents.Add(StartUp.chkGQUAL5.Text) + pConstituents.Add(StartUp.chkGQUAL5.Text & "-5") End If If StartUp.chkGQUAL6.Checked Then - pConstituents.Add(StartUp.chkGQUAL6.Text) + pConstituents.Add(StartUp.chkGQUAL6.Text & "-6") End If If StartUp.chkGQUAL7.Checked Then - pConstituents.Add(StartUp.chkGQUAL7.Text) + pConstituents.Add(StartUp.chkGQUAL7.Text & "-7") End If 'set up the timeseries attributes for statistics @@ -460,6 +460,7 @@ Module HSPFOutputReports Dim lConstituentName As String = "" Dim lActiveSections As New List(Of String) Dim CheckQUALID As Boolean = False + Dim GQALID As Integer = 0 Select Case lConstituent Case "Water" lConstituentName = "WAT" @@ -515,6 +516,7 @@ Module HSPFOutputReports lActiveSections.Add("PQUAL") lActiveSections.Add("IQUAL") lActiveSections.Add("GQUAL") + GQALID = Right(lConstituent, 1) End Select Dim lScenarioResults As New atcDataSource @@ -552,7 +554,9 @@ Module HSPFOutputReports Logger.Dbg(Now & " Generating Reports for " & lConstituent) lReportCons = Nothing - If Not (lConstituent = "DO" Or lConstituent = "Heat" Or lConstituent = "BOD-Labile") Then + If lConstituent = "TotalN" OrElse lConstituent = "TotalP" OrElse + lConstituent = "Sediment" OrElse lConstituent = "Water" Then + With HspfSupport.ConstituentBudget.Report(aHspfUci, lConstituent, lOperationTypes, pBaseName, lScenarioResults, pOutputLocations, lRunMade, SDateJ, EDateJ, lConstProperties) lReportCons = .Item1 diff --git a/atcHspfSupport/atcConstituentTables.vb b/atcHspfSupport/atcConstituentTables.vb index 7b304b2d8..75af9317c 100644 --- a/atcHspfSupport/atcConstituentTables.vb +++ b/atcHspfSupport/atcConstituentTables.vb @@ -166,6 +166,7 @@ Public Module atcConstituentTables Dim lMasslinkFactor As Double = 1.0 If lOutflowDataType = "TotalOutflow" Then lTS = lTotalTS + If lTS Is Nothing Then Continue For Dim lTsMonthly As atcTimeseries = Aggregate(lTS, atcTimeUnit.TUMonth, 1, atcTran.TranSumDiv) Dim lSeasons As New atcSeasonsMonth Dim lSeasonalAttributes As New atcDataAttributes @@ -317,6 +318,7 @@ Public Module atcConstituentTables Dim lMasslinkFactor As Double = 1.0 If lOutflowDataType = "TotalOutflow" Then lTS = lTotalTS + If lTS.numValues = 0 Then Continue For Dim lTsMonthly As atcTimeseries = Aggregate(lTS, atcTimeUnit.TUMonth, 1, atcTran.TranSumDiv) Dim lSeasons As New atcSeasonsMonth Dim lSeasonalAttributes As New atcDataAttributes @@ -461,6 +463,7 @@ Public Module atcConstituentTables Dim lMasslinkFactor As Double = 1.0 If lOutflowDataType = "TotalOutflow" Then lTS = lTotalTS + If lTS.numValues = 0 Then Continue For Dim lTsMonthly As atcTimeseries = Aggregate(lTS, atcTimeUnit.TUMonth, 1, atcTran.TranSumDiv) Dim lSeasons As New atcSeasonsMonth Dim lSeasonalAttributes As New atcDataAttributes @@ -674,6 +677,7 @@ Public Module atcConstituentTables Dim lMassLinkFactor As Double = 1.0 If lOutflowDataType.StartsWith("TotalOutflow") And lTotalTS.Dates IsNot Nothing Then lTS = lTotalTS + If lTS.numValues = 0 Then Continue For 'Start doing the montly calculations here. Dim lTsMonthly As atcTimeseries = Aggregate(lTS, atcTimeUnit.TUMonth, 1, atcTran.TranSumDiv) Dim lSeasons As New atcSeasonsMonth @@ -705,17 +709,17 @@ Public Module atcConstituentTables If lConnection.Target.VolName = "RCHRES" Then Dim aReach As HspfOperation = aUCI.OpnBlks("RCHRES").OperFromID(lConnection.Target.VolId) Dim aConversionFactor As Double = 0.0 - If aBalanceType = "TotalN" Or aBalanceType = "TotalP" Then + If aBalanceType = "TotalN" Or aBalanceType = "TotalP" Then aConversionFactor = ConversionFactorfromOxygen(aUCI, constituent.ReportType, aReach) - - Dim lMassLinkID As Integer = lConnection.MassLink + End If + Dim lMassLinkID As Integer = lConnection.MassLink If Not lMassLinkID = 0 Then lMassLinkFactor = FindMassLinkFactor(aUCI, lMassLinkID, lOutflowDataType, constituent.ReportType, aConversionFactor, lMultipleIndex) Exit For End If + 'End If End If - End If Next lConnection End If @@ -879,14 +883,16 @@ Public Module atcConstituentTables Dim OpType1 As String = item.Split("-")(0) Dim SelectExpression As String = "OpTypeNumber Like '" & item.Split(":")(0) & "%' And Year = 'SumAnnual' And OpDesc ='" & item.Split(":")(1) & "' And ConstNameEXP = '" & Constituent.ConstNameForEXPPlus & "'" Dim foundRows() As DataRow = Land_Constituent_Table.Select(SelectExpression) - Dim Values As New List(Of Double) - For Each foundrow As DataRow In foundRows - Values.Add(foundrow("TotalOutflow")) - Next foundrow - - If Values.Count > 0 Then - lDataForBoxWhiskerPlot.Units = "(" & foundRows(0)("Unit") & "/yr)" - landUseSumAnnualValues.Add(item, Values.ToArray) + Dim Values As New List(Of Double) + If foundRows.Length > 0 Then + For Each foundrow As DataRow In foundRows + Values.Add(foundrow("TotalOutflow")) + Next foundrow + + If Values.Count > 0 Then + lDataForBoxWhiskerPlot.Units = "(" & foundRows(0)("Unit") & "/yr)" + landUseSumAnnualValues.Add(item, Values.ToArray) + End If End If Next item lDataForBoxWhiskerPlot.LabelValueCollection = landUseSumAnnualValues @@ -900,29 +906,27 @@ Public Module atcConstituentTables Dim OpType1 As String = item.Split("-")(0) Dim SelectExpression As String = "OpTypeNumber Like '" & item.Split(":")(0) & "%' And OpDesc ='" & item.Split(":")(1) & "' And ConstNameEXP = '" & Constituent.ConstNameForEXPPlus & "'" Dim foundRows() As DataRow = Land_Constituent_Monthly_Table.Select(SelectExpression) - - For Each month As String In lMonthNames - Dim Values As New List(Of Double) - For Each MonthRow As DataRow In foundRows - Values.Add(MonthRow(month)) + If foundRows.Length > 0 Then + For Each month As String In lMonthNames + Dim Values As New List(Of Double) + For Each MonthRow As DataRow In foundRows + Values.Add(MonthRow(month)) + Next + If Values.Count > 0 Then + landUseSumAnnualValues.Add(Right(month, 3), Values.ToArray) + End If Next - If Values.Count > 0 Then - landUseSumAnnualValues.Add(Right(month, 3), Values.ToArray) - End If - Next - - lDataForBoxWhiskerPlot.LabelValueCollection = landUseSumAnnualValues - - If landUseSumAnnualValues.Count > 0 Then - lDataForBoxWhiskerPlot.Units = "(" & foundRows(0)("Unit") & ")" - - CreateGraph_BoxAndWhisker(lDataForBoxWhiskerPlot, AbsolutePath(System.IO.Path.Combine("MonthlyLoadings\" & Constituent.ConstNameForEXPPlus & "_" & item.Split(":")(0) & "_" & item.Split(":")(1) & "_BoxWhisker.png"), aoutfoldername), - "Monthly Loading Rate from Land Use " & item & "") - landUseSumAnnualValues.Clear() - End If + lDataForBoxWhiskerPlot.LabelValueCollection = landUseSumAnnualValues + If landUseSumAnnualValues.Count > 0 Then + lDataForBoxWhiskerPlot.Units = "(" & foundRows(0)("Unit") & ")" + CreateGraph_BoxAndWhisker(lDataForBoxWhiskerPlot, AbsolutePath(System.IO.Path.Combine("MonthlyLoadings\" & Constituent.ConstNameForEXPPlus & "_" & item.Split(":")(0) & "_" & item.Split(":")(1) & "_BoxWhisker.png"), aoutfoldername), + "Monthly Loading Rate from Land Use " & item & "") + landUseSumAnnualValues.Clear() + End If + End If Next item @@ -936,13 +940,16 @@ Public Module atcConstituentTables Dim OpType1 As String = item.Split("-")(0) Dim SelectExpression As String = "OpTypeNumber Like '" & item.Split(":")(0) & "%' And Year = 'SumAnnual' And OpDesc ='" & item.Split(":")(1) & "'" Dim foundRows() As DataRow = Land_Constituent_Table.Select(SelectExpression) - Dim Values As New List(Of Double) - For Each foundrow As DataRow In foundRows - Values.Add(foundrow("TotalOutflow")) - Next foundrow - If Values.Count > 0 Then - landUseSumAnnualValues.Add(item, Values.ToArray) - End If + Dim Values As New List(Of Double) + If foundRows.Length > 0 Then + For Each foundrow As DataRow In foundRows + Values.Add(foundrow("TotalOutflow")) + Next foundrow + If Values.Count > 0 Then + landUseSumAnnualValues.Add(item, Values.ToArray) + End If + End If + Next item If landUseSumAnnualValues.Count > 0 Then lDataForBoxWhiskerPlot.Units = "(" & lUnits & "/yr)" @@ -956,8 +963,8 @@ Public Module atcConstituentTables Dim OpType1 As String = item.Split("-")(0) Dim SelectExpression As String = "OpTypeNumber Like '" & item.Split(":")(0) & "%' And OpDesc ='" & item.Split(":")(1) & "'" Dim foundRows() As DataRow = Land_Constituent_Monthly_Table.Select(SelectExpression) - - For Each month As String In lMonthNames + If foundRows.Length > 0 Then + For Each month As String In lMonthNames Dim Values As New List(Of Double) For Each MonthRow As DataRow In foundRows Values.Add(MonthRow(month)) @@ -968,8 +975,9 @@ Public Module atcConstituentTables lDataForBoxWhiskerPlot.LabelValueCollection = landUseSumAnnualValues lDataForBoxWhiskerPlot.Units = "(" & lUnits & ")" - CreateGraph_BoxAndWhisker(lDataForBoxWhiskerPlot, AbsolutePath(System.IO.Path.Combine("MonthlyLoadings\" & aBalanceType & "_" & item.Split(":")(0) & "_" & item.Split(":")(1) & "_BoxWhisker.png"), aoutfoldername), + CreateGraph_BoxAndWhisker(lDataForBoxWhiskerPlot, AbsolutePath(System.IO.Path.Combine("MonthlyLoadings\" & aBalanceType & "_" & item.Split(":")(0) & "_" & item.Split(":")(1) & "_BoxWhisker.png"), aoutfoldername), "Monthly Loading Rate from Land Use " & item & "") + End If landUseSumAnnualValues.Clear() Next End If @@ -1077,6 +1085,7 @@ Public Module atcConstituentTables For Each lReach As HspfOperation In aUCI.OpnSeqBlock.Opns row = Reach_Budget_Table.NewRow If Not lReach.Name = "RCHRES" Then Continue For + If Not lReach.Tables("ACTIVITY").Parms("OXFG").Value = "1" Then Continue For Dim LocationName As String = lReach.Name.Substring(0, 1) & ":" & lReach.Id 'Dim lOutflowDataTypes1 As String() = ConstituentListRCHRES(aBalanceType) Dim lTS As New atcTimeseries(Nothing) @@ -1231,6 +1240,7 @@ Public Module atcConstituentTables For Each lReach As HspfOperation In aUCI.OpnSeqBlock.Opns row = Reach_Budget_Table.NewRow If Not lReach.Name = "RCHRES" Then Continue For + If Not lReach.Tables("ACTIVITY").Parms("HTFG").Value = "1" Then Continue For Dim LocationName As String = lReach.Name.Substring(0, 1) & ":" & lReach.Id 'Dim lOutflowDataTypes1 As String() = ConstituentListRCHRES(aBalanceType) Dim lTS As New atcTimeseries(Nothing) diff --git a/atcHspfSupport/modUtility.vb b/atcHspfSupport/modUtility.vb index 8c3020142..bb8594e06 100644 --- a/atcHspfSupport/modUtility.vb +++ b/atcHspfSupport/modUtility.vb @@ -821,8 +821,8 @@ Public Module Utility Return lConstituentsToOutput End Function - Public Function LandUses(ByVal aUci As HspfUci, _ - ByVal aOperationTypes As atcCollection, _ + Public Function LandUses(ByVal aUci As HspfUci, + ByVal aOperationTypes As atcCollection, Optional ByVal aOutletLocation As String = "") As atcCollection Dim lLocations As New atcCollection If aOutletLocation.Length > 0 Then @@ -880,25 +880,25 @@ Public Module Utility Return lLandUsesTemp End Function - Public Function UpstreamLocations(ByVal aUci As HspfUci, _ - ByVal aOperationTypes As atcCollection, _ + Public Function UpstreamLocations(ByVal aUci As HspfUci, + ByVal aOperationTypes As atcCollection, ByVal aLocation As String) As atcCollection Dim lLocations As New atcCollection 'key-location, value-total area UpstreamLocationAreaCalc(aUci, aLocation, aOperationTypes, lLocations) Return lLocations End Function - Private Sub UpstreamLocationAreaCalc(ByVal aUci As HspfUci, _ - ByVal aLocation As String, _ - ByVal aOperationTypes As atcCollection, _ + Private Sub UpstreamLocationAreaCalc(ByVal aUci As HspfUci, + ByVal aLocation As String, + ByVal aOperationTypes As atcCollection, ByRef aLocations As atcCollection) LocationAreaCalc(aUci, aLocation, aOperationTypes, aLocations, True) End Sub - Public Sub LocationAreaCalc(ByVal aUci As HspfUci, _ - ByVal aLocation As String, _ - ByVal aOperationTypes As atcCollection, _ - ByRef aLocations As atcCollection, _ + Public Sub LocationAreaCalc(ByVal aUci As HspfUci, + ByVal aLocation As String, + ByVal aOperationTypes As atcCollection, + ByRef aLocations As atcCollection, ByVal aUpstream As Boolean) Dim lOperName As String = aOperationTypes.ItemByKey(aLocation.Substring(0, 2)) @@ -920,8 +920,8 @@ Public Module Utility If aUpstream Then If lUpstreamChecked.Contains(lLocationKey) Then Logger.Dbg("SkipDuplicate:" & lLocationKey) - ElseIf aUci.Name.ToLower.Contains("scr") AndAlso _ - lConnection.Source.VolId = 229 AndAlso _ + ElseIf aUci.Name.ToLower.Contains("scr") AndAlso + lConnection.Source.VolId = 229 AndAlso lConnection.Target.VolId = 516 Then 'TODO: figure out a way not to hardcode this! Logger.Dbg("Skip 229 to 516 in SantaClara") @@ -955,7 +955,7 @@ Public Module Utility Return lArea End Function - Public Function CfsToInches(ByVal aTSerIn As atcTimeseries, _ + Public Function CfsToInches(ByVal aTSerIn As atcTimeseries, ByVal aArea As Double) As atcTimeseries Dim lConversionFactor As Double = (12.0# * 24.0# * 3600.0#) / (aArea * 43560.0#) 'cfs days to inches Dim lTsMath As atcTimeseriesSource = New atcTimeseriesMath.atcTimeseriesMath @@ -966,7 +966,7 @@ Public Module Utility Return lTsMath.DataSets(0) End Function - Public Function InchesToCfs(ByVal aTSerIn As atcTimeseries, _ + Public Function InchesToCfs(ByVal aTSerIn As atcTimeseries, ByVal aArea As Double) As atcTimeseries Dim lConversionFactor As Double = (aArea * 43560.0#) / (12.0# * 24.0# * 3600.0#) 'inches to cfs days Dim lInterval As Double = aTSerIn.Attributes.GetValue("interval", 1.0) @@ -979,29 +979,29 @@ Public Module Utility Return lTsMath.DataSets(0) End Function - Friend Sub CheckDateJ(ByVal aTSer As atcTimeseries, _ - ByVal aName As String, _ - ByRef aSDateJ As Double, _ - ByRef aEDateJ As Double, _ + Friend Sub CheckDateJ(ByVal aTSer As atcTimeseries, + ByVal aName As String, + ByRef aSDateJ As Double, + ByRef aEDateJ As Double, ByRef aStr As String) Dim lDateTmp As Double = aTSer.Dates.Values(0) If aSDateJ < lDateTmp Then - aStr &= " Adjusted Start Date from " & Format(Date.FromOADate(aSDateJ), "yyyy/MM/dd") & _ - "to " & Format(Date.FromOADate(lDateTmp), "yyyy/MM/dd") & _ + aStr &= " Adjusted Start Date from " & Format(Date.FromOADate(aSDateJ), "yyyy/MM/dd") & + "to " & Format(Date.FromOADate(lDateTmp), "yyyy/MM/dd") & " due to " & aName & vbCrLf & vbCrLf aSDateJ = lDateTmp End If lDateTmp = aTSer.Dates.Values(aTSer.numValues) If aEDateJ > lDateTmp Then - aStr &= " Adjusted End Date from " & Format(Date.FromOADate(aEDateJ), "yyyy/MM/dd") & _ - " to " & Format(Date.FromOADate(lDateTmp), "yyyy/MM/dd") & _ + aStr &= " Adjusted End Date from " & Format(Date.FromOADate(aEDateJ), "yyyy/MM/dd") & + " to " & Format(Date.FromOADate(lDateTmp), "yyyy/MM/dd") & " due to " & aName & vbCrLf & vbCrLf aEDateJ = lDateTmp End If End Sub - Public Function AreaReport(ByVal aUci As HspfUci, ByVal aRunMade As String, _ - ByVal aOperationTypes As atcCollection, ByVal aLocations As atcCollection, _ + Public Function AreaReport(ByVal aUci As HspfUci, ByVal aRunMade As String, + ByVal aOperationTypes As atcCollection, ByVal aLocations As atcCollection, ByVal aLandUseReport As Boolean, ByVal aReportPath As String) As atcReport.IReport Dim lReport As New atcReport.ReportText lReport.AppendLine("Area Summary Report") @@ -1020,8 +1020,8 @@ Public Module Utility Return lReport End Function - Private Function AreaReportLocation(ByVal aUci As HspfUci, ByVal aOperationtypes As atcCollection, _ - ByVal aLocation As String, ByVal aLandUseReport As Boolean, _ + Private Function AreaReportLocation(ByVal aUci As HspfUci, ByVal aOperationtypes As atcCollection, + ByVal aLocation As String, ByVal aLandUseReport As Boolean, ByVal aReportPath As String, ByVal aRunMade As String) As String If aLandUseReport Then Dim lReport As New atcReport.ReportText @@ -1030,9 +1030,9 @@ Public Module Utility lReport.AppendLine(" Run Made " & aRunMade) lReport.AppendLine(" " & aUci.GlobalBlock.RunInf.Value) lReport.AppendLine("") - lReport.AppendLine("Landuse".PadLeft(20) & vbTab & _ - "PervArea".PadLeft(12) & vbTab & _ - "ImpvArea".PadLeft(12) & vbTab & _ + lReport.AppendLine("Landuse".PadLeft(20) & vbTab & + "PervArea".PadLeft(12) & vbTab & + "ImpvArea".PadLeft(12) & vbTab & "TotalArea".PadLeft(12)) Dim lLandUses As atcCollection = LandUses(aUci, aOperationtypes, aLocation) Dim lLandUsesCombinePervImpv As atcCollection = LandUsesCombined(lLandUses) @@ -1051,9 +1051,9 @@ Public Module Utility Dim lLandUseArea As Double = lPervArea + lImprArea - lReport.AppendLine(lLandUsesCombinePervImpv.Keys(lLandUseIndex).ToString.PadLeft(20) & vbTab & _ - DecimalAlign(lPervArea, , 2, 7) & vbTab & _ - DecimalAlign(lImprArea, , 2, 7) & vbTab & _ + lReport.AppendLine(lLandUsesCombinePervImpv.Keys(lLandUseIndex).ToString.PadLeft(20) & vbTab & + DecimalAlign(lPervArea, , 2, 7) & vbTab & + DecimalAlign(lImprArea, , 2, 7) & vbTab & DecimalAlign(lLandUseArea, , 2, 7)) lTotalAreaPerv += lPervArea lTotalAreaImpr += lImprArea @@ -1062,9 +1062,9 @@ Public Module Utility lLandUsesCombinePervImpv.Clear() lLandUses.Clear() lReport.AppendLine("") - lReport.AppendLine("Total".PadLeft(20) & vbTab & _ - DecimalAlign(lTotalAreaPerv, , 2, 7) & vbTab & _ - DecimalAlign(lTotalAreaImpr, , 2, 7) & vbTab & _ + lReport.AppendLine("Total".PadLeft(20) & vbTab & + DecimalAlign(lTotalAreaPerv, , 2, 7) & vbTab & + DecimalAlign(lTotalAreaImpr, , 2, 7) & vbTab & DecimalAlign(lTotalAreaFromLandUses, , 2, 7)) SaveFileString(aReportPath & SafeFilename("AreaLanduse_" & aLocation & ".txt"), lReport.ToString) End If @@ -1101,9 +1101,9 @@ Public Module Utility lStr &= AreaReportLocation(aUci, aOperationtypes, lUpstreamLocation, aLandUseReport, aReportPath, aRunMade) Next lUpstreamLocations.Clear() - lStr &= aLocation.PadRight(8) & vbTab & _ - DecimalAlign(lTotalArea, , 2, 7) & vbTab & _ - DecimalAlign(lLocalArea, , 2, 7) & vbTab & _ + lStr &= aLocation.PadRight(8) & vbTab & + DecimalAlign(lTotalArea, , 2, 7) & vbTab & + DecimalAlign(lLocalArea, , 2, 7) & vbTab & lUpstreamLocationsString & vbCrLf Return lStr End Function @@ -1557,6 +1557,20 @@ Public Module Utility "SOHT_POHT_IHEAT_1", "IOHT_POHT_IHEAT_1", "AOHT_POHT_IHEAT_1" lMassLinkFactor = lMassLink.MFact End Select + Case Else + Dim GQUALID As Integer = Right(aBalanceType, 1) + Select Case True + 'Need to do it for sediment associated GQUAL + Case aConstituent.Contains("SOQO") AndAlso lMassLink.Target.Member = "IDQAL" AndAlso lMassLink.Target.MemSub1 = GQUALID AndAlso + (lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "SOQUAL") + lMassLinkFactor = lMassLink.MFact + Case aConstituent.Contains("IOQUAL") AndAlso lMassLink.Target.Member = "IDQAL" AndAlso lMassLink.Target.MemSub1 = GQUALID AndAlso + (lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "IOQUAL") + lMassLinkFactor = lMassLink.MFact + Case aConstituent.Contains("AOQUAL") AndAlso lMassLink.Target.Member = "IDQAL" AndAlso lMassLink.Target.MemSub1 = GQUALID AndAlso + (lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "AOQUAL") + lMassLinkFactor = lMassLink.MFact + End Select End Select Next @@ -1567,9 +1581,9 @@ Public Module Utility End Function Public Function BODMFact(ByVal aUCI As HspfUci, ByVal aconstituent As String, ByVal aMassLinkID As Integer) As Double For Each lMasslink As HspfMassLink In aUCI.MassLinks - If lMasslink.MassLinkId = aMassLinkID AndAlso _ - (lMasslink.Source.Member.Substring(0, 2) = "PO" Or lMasslink.Source.Member.Substring(0, 2) = aconstituent.Substring(0, 2)) AndAlso _ - lMasslink.Target.Member = "OXIF" AndAlso _ + If lMasslink.MassLinkId = aMassLinkID AndAlso + (lMasslink.Source.Member.Substring(0, 2) = "PO" Or lMasslink.Source.Member.Substring(0, 2) = aconstituent.Substring(0, 2)) AndAlso + lMasslink.Target.Member = "OXIF" AndAlso lMasslink.Target.MemSub1 = 2 Then Return lMasslink.MFact @@ -1920,28 +1934,29 @@ Public Module Utility QUALNames = New ConstituentProperties QUALNames.ConstNameForEXPPlus = aBalanceType QUALNames.ConstituentNameInUCI = aBalanceType - + Dim GQALID As Integer = Right(aBalanceType, 1) lTableName = "QUAL-PROPS" + If GQALID > 1 Then lTableName = lTableName & ":" & GQALID Dim lTempQual As String = "" Dim lUnits As String = "" If lOper.TableExists(lTableName) Then lTempQual = Trim(lOper.Tables(lTableName).Parms("QUALID").Value) - If aBalanceType = lTempQual Then + If SafeSubstring(aBalanceType, 0, aBalanceType.Length - 2) = lTempQual Then 'found it lUnits = Trim(lOper.Tables(lTableName).Parms("QTYID").Value) End If End If - Do While lUnits.Length = 0 - For lIndex As Integer = 2 To 10 - If lOper.TableExists(lTableName & ":" & lIndex.ToString) Then - lTempQual = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QUALID").Value) - If aBalanceType = lTempQual Then - 'found it - lUnits = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QTYID").Value) - End If - End If - Next - Loop + 'Do While lUnits.Length = 0 + ' For lIndex As Integer = 2 To 10 + ' If lOper.TableExists(lTableName & ":" & lIndex.ToString) Then + ' lTempQual = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QUALID").Value) + ' If SafeSubstring(aBalanceType, 1, aBalanceType.Length - 2) = lTempQual Then + ' 'found it + ' lUnits = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QTYID").Value) + ' End If + ' End If + ' Next + 'Loop If aUCI.GlobalBlock.EmFg = 1 Then QUALNames.ConstituentUnit = lUnits & "/ac" @@ -2023,6 +2038,8 @@ Public Module Utility Case Else 'case for GQuals 'lOutflowDataType.Add("SOQUAL" & "-" & EXPPlusName, "SOQUAL" & "-" & QualityConstituent) + EXPPlusName = SafeSubstring(aBalanceType, 0, aBalanceType.Length - 2) + QualityConstituent = SafeSubstring(aBalanceType, 0, aBalanceType.Length - 2) lOutflowDataType.Add("WASHQS" & "-" & EXPPlusName, "WASHQS" & "-" & QualityConstituent) lOutflowDataType.Add("SCRQS" & "-" & EXPPlusName, "SCRQS" & "-" & QualityConstituent) lOutflowDataType.Add("SOQO" & "-" & EXPPlusName, "SOQO" & "-" & QualityConstituent) @@ -2031,10 +2048,6 @@ Public Module Utility lOutflowDataType.Add("TotalOutflow" & "-" & EXPPlusName, "TotalOutflow" & "-" & QualityConstituent) End Select - - - - Return lOutflowDataType End Function @@ -2064,7 +2077,7 @@ Public Module Utility Public Function GQualUnits(ByVal aUCI As HspfUci, ByVal aGQualName As String) As String 'given a uci and gqualname, return the units of the gqual Dim lUnits As String = "" - + Dim GQALID As Integer = Right(aGQualName, 1) Dim lOper As New HspfOperation For Each Oper As HspfOperation In aUCI.OpnBlks("RCHRES").Ids If Oper.Tables("ACTIVITY").Parms("GQALFG").Value = "1" Then @@ -2076,6 +2089,7 @@ Public Module Utility If lOper IsNot Nothing Then Dim lTableName As String = "GQ-QALDATA" + If GQALID > 1 Then lTableName = lTableName & ":" & GQALID Dim lTempQual As String = "" If lOper.TableExists(lTableName) Then lTempQual = Trim(lOper.Tables(lTableName).Parms("GQID").Value) @@ -2084,17 +2098,17 @@ Public Module Utility lUnits = Trim(lOper.Tables(lTableName).Parms("QTYID").Value) End If End If - Do While lUnits.Length = 0 - For lIndex As Integer = 2 To 10 - If lOper.TableExists(lTableName & ":" & lIndex.ToString) Then - lTempQual = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("GQID").Value) - If aGQualName = lTempQual Then - 'found it - lUnits = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QTYID").Value) - End If - End If - Next - Loop + 'Do While lUnits.Length = 0 + ' For lIndex As Integer = 2 To 10 + ' If lOper.TableExists(lTableName & ":" & lIndex.ToString) Then + ' lTempQual = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("GQID").Value) + ' If aGQualName = lTempQual Then + ' 'found it + ' lUnits = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QTYID").Value) + ' End If + ' End If + ' Next + 'Loop End If Return lUnits From c0e11178bb98fe312df7f102fac9370b9cfbe47b Mon Sep 17 00:00:00 2001 From: "tong.zhai" Date: Fri, 2 Mar 2018 22:07:32 -0500 Subject: [PATCH 06/14] New Water Quality Data US library - New time series library for reading comprehensive water quality data from mutltiple sources - allows users to select location/constituents before generating time series --- .../My Project/Application.myapp | 10 + .../My Project/Settings.Designer.vb | 73 +++ .../My Project/Settings.settings | 7 + .../atcTimeseriesWaterQualUS.vb | 191 +++++++ .../atcTimeseriesWaterQualUS15.vbproj | 161 ++++++ .../clsWaterQualityDataUS.vb | 537 ++++++++++++++++++ .../frmSelect.Designer.vb | 181 ++++++ atcTimeseriesWaterQualUS/frmSelect.resx | 120 ++++ atcTimeseriesWaterQualUS/frmSelect.vb | 104 ++++ 9 files changed, 1384 insertions(+) create mode 100644 atcTimeseriesWaterQualUS/My Project/Application.myapp create mode 100644 atcTimeseriesWaterQualUS/My Project/Settings.Designer.vb create mode 100644 atcTimeseriesWaterQualUS/My Project/Settings.settings create mode 100644 atcTimeseriesWaterQualUS/atcTimeseriesWaterQualUS.vb create mode 100644 atcTimeseriesWaterQualUS/atcTimeseriesWaterQualUS15.vbproj create mode 100644 atcTimeseriesWaterQualUS/clsWaterQualityDataUS.vb create mode 100644 atcTimeseriesWaterQualUS/frmSelect.Designer.vb create mode 100644 atcTimeseriesWaterQualUS/frmSelect.resx create mode 100644 atcTimeseriesWaterQualUS/frmSelect.vb diff --git a/atcTimeseriesWaterQualUS/My Project/Application.myapp b/atcTimeseriesWaterQualUS/My Project/Application.myapp new file mode 100644 index 000000000..758895def --- /dev/null +++ b/atcTimeseriesWaterQualUS/My Project/Application.myapp @@ -0,0 +1,10 @@ + + + false + false + 0 + true + 0 + 1 + true + diff --git a/atcTimeseriesWaterQualUS/My Project/Settings.Designer.vb b/atcTimeseriesWaterQualUS/My Project/Settings.Designer.vb new file mode 100644 index 000000000..17dd1b974 --- /dev/null +++ b/atcTimeseriesWaterQualUS/My Project/Settings.Designer.vb @@ -0,0 +1,73 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + + +Namespace My + + _ + Partial Friend NotInheritable Class MySettings + Inherits Global.System.Configuration.ApplicationSettingsBase + + Private Shared defaultInstance As MySettings = CType(Global.System.Configuration.ApplicationSettingsBase.Synchronized(New MySettings()),MySettings) + +#Region "My.Settings Auto-Save Functionality" +#If _MyType = "WindowsForms" Then + Private Shared addedHandler As Boolean + + Private Shared addedHandlerLockObject As New Object + + _ + Private Shared Sub AutoSaveSettings(ByVal sender As Global.System.Object, ByVal e As Global.System.EventArgs) + If My.Application.SaveMySettingsOnExit Then + My.Settings.Save() + End If + End Sub +#End If +#End Region + + Public Shared ReadOnly Property [Default]() As MySettings + Get + +#If _MyType = "WindowsForms" Then + If Not addedHandler Then + SyncLock addedHandlerLockObject + If Not addedHandler Then + AddHandler My.Application.Shutdown, AddressOf AutoSaveSettings + addedHandler = True + End If + End SyncLock + End If +#End If + Return defaultInstance + End Get + End Property + End Class +End Namespace + +Namespace My + + _ + Friend Module MySettingsProperty + + _ + Friend ReadOnly Property Settings() As Global.atcTimeseriesWaterQualUS.My.MySettings + Get + Return Global.atcTimeseriesWaterQualUS.My.MySettings.Default + End Get + End Property + End Module +End Namespace diff --git a/atcTimeseriesWaterQualUS/My Project/Settings.settings b/atcTimeseriesWaterQualUS/My Project/Settings.settings new file mode 100644 index 000000000..85b890b3c --- /dev/null +++ b/atcTimeseriesWaterQualUS/My Project/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/atcTimeseriesWaterQualUS/atcTimeseriesWaterQualUS.vb b/atcTimeseriesWaterQualUS/atcTimeseriesWaterQualUS.vb new file mode 100644 index 000000000..ee485c0c4 --- /dev/null +++ b/atcTimeseriesWaterQualUS/atcTimeseriesWaterQualUS.vb @@ -0,0 +1,191 @@ +Imports atcData +Imports atcUtility +Imports MapWinUtility +Imports System.Collections +Imports System.IO +Imports System.Text.RegularExpressions +Imports Microsoft.VisualBasic.FileIO.TextFieldParser + +Public Class atcTimeseriesWaterQualUS + Inherits atcTimeseriesSource + Private Shared pFilter As String = "WaterQualityData US Files (*.csv)|*.csv;|All Files (*.*)|*.*" + Private pJulianInterval As Double = 1 'Add one day for daily values to record date at end of interval + Public RawDataGroup As New clsWQDUSLocations() 'Dictionary(Of String, clsWQDUSLocation)() + Public SelectAllLocations As Boolean = False + Public SelectAllConstituents As Boolean = False + Public SelectedLocations As New List(Of String)() + Public SelectedConstituents As New List(Of String)() + Public AllConstituents As New List(Of String)() + + Public Overrides ReadOnly Property Description() As String + Get + Return "WaterQualityData US" + End Get + End Property + + Public Overrides ReadOnly Property Name() As String + Get + Return "Timeseries::WaterQualityData US" + End Get + End Property + + Public Overrides ReadOnly Property Category() As String + Get + Return "File" + End Get + End Property + + Public Overrides ReadOnly Property CanOpen() As Boolean + Get + Return True + End Get + End Property + + Public Overrides ReadOnly Property CanSave() As Boolean + Get + Return False + End Get + End Property + + Public Overrides Function Open(ByVal aFileName As String, + Optional ByVal aAttributes As atcData.atcDataAttributes = Nothing) As Boolean + If MyBase.Open(aFileName, aAttributes) Then + If Not IO.File.Exists(Specification) Then + Logger.Dbg("Opening new file " & Specification) + Return True + ElseIf IO.Path.GetFileName(Specification).ToLower.StartsWith("stations") Then + Throw New ApplicationException("Station file does not contain timeseries data: " & IO.Path.GetFileName(Specification)) + Else + Try + Dim lTimeStartOpen As Date = Now + Logger.Dbg("OpenStartFor " & Specification) + Dim CurrentRecord() As String + Dim lDataColumnsValid As Boolean = True + Dim lFileInfo As New FileInfo(Specification) + Dim lSr As New StreamReader(Specification, True) + Dim lEncoding As Text.Encoding = lSr.CurrentEncoding() + lSr.Close() + lSr = Nothing + Dim lFileSize As Long = lFileInfo.Length + Dim lRunningSize As Long = 0 + Using afile As New Microsoft.VisualBasic.FileIO.TextFieldParser(Specification) + afile.TextFieldType = FileIO.FieldType.Delimited + afile.Delimiters = New String() {","} + afile.HasFieldsEnclosedInQuotes = True + + Dim first As Boolean = True + ' parse the actual file + Dim loc_id As String + Dim loc As clsWQDUSLocation + While Not afile.EndOfData + Try + CurrentRecord = afile.ReadFields + lRunningSize += lEncoding.GetByteCount(String.Join(",", CurrentRecord)) + Logger.Progress(lRunningSize / lFileSize * 100.0, 100) + If first Then + first = False + If Not clsWQDUSColumns.SetColumns(CurrentRecord) Then + lDataColumnsValid = False + Exit While + End If + Continue While + Else + loc_id = CurrentRecord(clsWQDUSColumns.colMonitoringLocationIdentifier) + If RawDataGroup.ContainsKey(loc_id) Then + loc = RawDataGroup.Item(loc_id) + Else + loc = New clsWQDUSLocation(loc_id) + RawDataGroup.Add(loc_id, loc) + End If + loc.AddData(CurrentRecord) + End If + Catch ex As FileIO.MalformedLineException + MsgBox("Line " & ex.Message & "is not valid and will be skipped.") + End Try + End While + End Using + Logger.Progress(100, 100) + If lDataColumnsValid Then + SelectedConstituents.Clear() + SelectedLocations.Clear() + Dim lfrm As New frmSelect(RawDataGroup, SelectedLocations, SelectedConstituents) + If lfrm.ShowDialog() = Windows.Forms.DialogResult.OK Then + If SelectedLocations.Count > 0 AndAlso SelectedConstituents.Count > 0 Then + Return BuildTimeseries() + End If + End If + Else + Return False + End If + Return True + Catch lException As Exception + Logger.Progress(100, 100) + Throw New ApplicationException("Exception reading '" & Specification & "': " & lException.Message, lException) + End Try + End If + End If + Return True + End Function + + Public Sub New() + Filter = pFilter + End Sub + + Public Function BuildTimeseries() As Boolean + If RawDataGroup.Count = 0 Then + Return False + End If + Dim lBuildOk As Boolean = True + Try + Dim lGroupBuilder As New atcTimeseriesGroupBuilder(Me) + Dim lTSBuilder As atcTimeseriesBuilder + For Each loc As clsWQDUSLocation In RawDataGroup.Values + If Not SelectAllLocations AndAlso Not SelectedLocations.Contains(loc.Location) Then + Continue For + End If + For Each cons As clsWQDUSConstituent In loc.Constituents.Values + For Each lcon_unit As String In cons.RecordGroup.Keys + If Not SelectAllConstituents Then + If Not SelectedConstituents.Contains(cons.Name & "-" & lcon_unit) Then + Continue For + End If + End If + Dim ldata As List(Of clsWQDUSDataPoint) = cons.RecordGroup.Item(lcon_unit) + If ldata.Count > 0 Then + lTSBuilder = lGroupBuilder.Builder(loc.Location & ":" & cons.Name & ":" & lcon_unit) + With lTSBuilder.Attributes + 'Set attributes of newly created builder + If Not .ContainsAttribute("Location") Then + .SetValue("Scenario", "Observed") + .SetValue("Location", loc.Location) + .SetValue("Constituent", cons.Name) + .SetValue("Units", lcon_unit) + '.SetValue("CCode", lCcode) + .SetValue("Point", True) + .AddHistory("Read from " & Specification) + End If + End With + For I As Integer = 0 To ldata.Count - 1 + 'ldt = Date.Parse(lTable.Value(lDateCol)).ToOADate + If ldata(I).SetDataTime() Then + lTSBuilder.AddValue(ldata(I).atcDataTime, ldata(I).Value) + If Not String.IsNullOrEmpty(ldata(I).Attrib) Then + lTSBuilder.AddValueAttribute("RCode", ldata(I).Attrib) + End If + Else + Continue For + End If + Next 'data point + End If + Next 'lcon_unit + Next 'cons + Next 'loc + lGroupBuilder.CreateTimeseriesAddToGroup(DataSets) + lBuildOk = True + Catch ex As Exception + lBuildOk = False + Logger.Msg("Build datasets failed in " & Specification, "WaterQualityData US Build Dataset") + End Try + Return lBuildOk + End Function +End Class diff --git a/atcTimeseriesWaterQualUS/atcTimeseriesWaterQualUS15.vbproj b/atcTimeseriesWaterQualUS/atcTimeseriesWaterQualUS15.vbproj new file mode 100644 index 000000000..f69924a30 --- /dev/null +++ b/atcTimeseriesWaterQualUS/atcTimeseriesWaterQualUS15.vbproj @@ -0,0 +1,161 @@ + + + + + Debug + AnyCPU + {5645ECEF-CB9A-42F8-AE33-11ED10A452CC} + Library + atcTimeseriesWaterQualUS + atcTimeseriesWaterQualUS + 512 + Windows + v3.5 + + + + true + full + true + true + ..\Bin\Plugins\BASINS\ + atcTimeseriesWaterQualUS.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + x86 + + + pdbonly + false + true + true + bin\Release\ + atcTimeseriesWaterQualUS.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + + + On + + + Binary + + + Off + + + On + + + true + true + true + ..\Bin\Plugins\BASINS\ + atcTimeseriesWaterQualUS.xml + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + full + x86 + MinimumRecommendedRules.ruleset + + + true + bin\x86\Release\ + atcTimeseriesWaterQualUS.xml + true + 42016,41999,42017,42018,42019,42032,42036,42020,42021,42022 + pdbonly + x86 + MinimumRecommendedRules.ruleset + + + + + + + + + + + + + + + + + + + + + + + + + + + frmSelect.vb + + + Form + + + + True + Application.myapp + + + True + True + Resources.resx + + + True + Settings.settings + True + + + + + frmSelect.vb + + + VbMyResourcesResXFileCodeGenerator + Resources.Designer.vb + My.Resources + Designer + + + + + MyApplicationCodeGenerator + Application.Designer.vb + + + SettingsSingleFileGenerator + My + Settings.Designer.vb + + + + + {a9a00cad-9ead-4228-ab08-6dc3baf253aa} + atcData15 + False + + + {67027820-9036-481e-80f6-077e5085f59d} + atcUtility15 + False + + + {33e88992-742f-4d13-823f-35d6a07b1aa1} + BASINS-MapWinUtility15 + False + + + + + \ No newline at end of file diff --git a/atcTimeseriesWaterQualUS/clsWaterQualityDataUS.vb b/atcTimeseriesWaterQualUS/clsWaterQualityDataUS.vb new file mode 100644 index 000000000..f4f44ede2 --- /dev/null +++ b/atcTimeseriesWaterQualUS/clsWaterQualityDataUS.vb @@ -0,0 +1,537 @@ +Imports atcData +Imports atcUtility + +Public Class clsWQDUSColumns + Public Shared colOrganizationIdentifier As Integer = -1 + Public Shared colOrganizationFormalName As Integer = -1 + Public Shared colActivityIdentifier As Integer = -1 + Public Shared colActivityTypeCode As Integer = -1 + Public Shared colActivityMediaName As Integer = -1 + Public Shared colActivityMediaSubdivisionName As Integer = -1 + Public Shared colActivityStartDate As Integer = -1 + Public Shared colActivityStartTime As Integer = -1 + Public Shared colActivityStartTimeZoneCode As Integer = -1 + Public Shared colActivityEndDate As Integer = -1 + Public Shared colActivityEndTime As Integer = -1 + Public Shared colActivityEndTimeZoneCode As Integer = -1 + Public Shared colActivityDepthHeightMeasureValue As Integer = -1 + Public Shared colActivityDepthHeightMeasureUnitCode As Integer = -1 + Public Shared colActivityDepthAltitudeReferencePointText As Integer = -1 + Public Shared colActivityTopDepthHeightMeasureValue As Integer = -1 + Public Shared colActivityTopDepthHeightMeasureUnitCode As Integer = -1 + Public Shared colActivityBottomDepthHeightMeasureValue As Integer = -1 + Public Shared colActivityBottomDepthHeightMeasureUnitCode As Integer = -1 + Public Shared colProjectIdentifier As Integer = -1 + Public Shared colActivityConductingOrganizationText As Integer = -1 + Public Shared colMonitoringLocationIdentifier As Integer = -1 + Public Shared colActivityCommentText As Integer = -1 + Public Shared colSampleAquifer As Integer = -1 + Public Shared colHydrologicCondition As Integer = -1 + Public Shared colHydrologicEvent As Integer = -1 + Public Shared colSampleCollectionMethodIdentifier As Integer = -1 + Public Shared colSampleCollectionMethodIdentifierContext As Integer = -1 + Public Shared colSampleCollectionMethodName As Integer = -1 + Public Shared colSampleCollectionEquipmentName As Integer = -1 + Public Shared colResultDetectionConditionText As Integer = -1 + Public Shared colCharacteristicName As Integer = -1 + Public Shared colResultSampleFractionText As Integer = -1 + Public Shared colResultMeasureValue As Integer = -1 + Public Shared colResultMeasureUnitCode As Integer = -1 + Public Shared colMeasureQualifierCode As Integer = -1 + Public Shared colResultStatusIdentifier As Integer = -1 + Public Shared colStatisticalBaseCode As Integer = -1 + Public Shared colResultValueTypeName As Integer = -1 + Public Shared colResultWeightBasisText As Integer = -1 + Public Shared colResultTimeBasisText As Integer = -1 + Public Shared colResultTemperatureBasisText As Integer = -1 + Public Shared colResultParticleSizeBasisText As Integer = -1 + Public Shared colPrecisionValue As Integer = -1 + Public Shared colResultCommentText As Integer = -1 + Public Shared colUSGSPCode As Integer = -1 + Public Shared colResultDepthHeightMeasureValue As Integer = -1 + Public Shared colResultDepthHeightMeasureUnitCode As Integer = -1 + Public Shared colResultDepthAltitudeReferencePointText As Integer = -1 + Public Shared colSubjectTaxonomicName As Integer = -1 + Public Shared colSampleTissueAnatomyName As Integer = -1 + Public Shared colResultAnalyticalMethodIdentifier As Integer = -1 + Public Shared colResultAnalyticalMethodIdentifierContext As Integer = -1 + Public Shared colResultAnalyticalMethodName As Integer = -1 + Public Shared colMethodDescriptionText As Integer = -1 + Public Shared colLaboratoryName As Integer = -1 + Public Shared colAnalysisStartDate As Integer = -1 + Public Shared colResultLaboratoryCommentText As Integer = -1 + Public Shared colDetectionQuantitationLimitTypeName As Integer = -1 + Public Shared colDetectionQuantitationLimitMeasureValue As Integer = -1 + Public Shared colDetectionQuantitationLimitMeasureUnitCode As Integer = -1 + Public Shared colPreparationStartDate As Integer = -1 + Public Shared colProviderName As Integer = -1 + + Public Shared Function SetColumns(ByVal aRecord() As String) As Boolean + If aRecord Is Nothing OrElse aRecord.Length = 0 Then + Return False + End If + For I As Integer = 0 To aRecord.Length - 1 + If aRecord(I).StartsWith("OrganizationIdentifier") Then colOrganizationIdentifier = I + If aRecord(I).StartsWith("OrganizationFormalName") Then colOrganizationFormalName = I + If aRecord(I).StartsWith("ActivityIdentifier") Then colActivityIdentifier = I + If aRecord(I).StartsWith("ActivityTypeCode") Then colActivityTypeCode = I + If aRecord(I).StartsWith("ActivityMediaName") Then colActivityMediaName = I + If aRecord(I).StartsWith("ActivityMediaSubdivisionName") Then colActivityMediaSubdivisionName = I + If aRecord(I).StartsWith("ActivityStartDate") Then colActivityStartDate = I + If aRecord(I).StartsWith("ActivityStartTime/Time") Then colActivityStartTime = I + If aRecord(I).StartsWith("ActivityStartTime/TimeZoneCode") Then colActivityStartTimeZoneCode = I + If aRecord(I).StartsWith("ActivityEndDate") Then colActivityEndDate = I + If aRecord(I).StartsWith("ActivityEndTime/Time") Then colActivityEndTime = I + If aRecord(I).StartsWith("ActivityEndTime/TimeZoneCode") Then colActivityEndTimeZoneCode = I + If aRecord(I).StartsWith("ActivityDepthHeightMeasure/MeasureValue") Then colActivityDepthHeightMeasureValue = I + If aRecord(I).StartsWith("ActivityDepthHeightMeasure/MeasureUnitCode") Then colActivityDepthHeightMeasureUnitCode = I + If aRecord(I).StartsWith("ActivityDepthAltitudeReferencePointText") Then colActivityDepthAltitudeReferencePointText = I + If aRecord(I).StartsWith("ActivityTopDepthHeightMeasure/MeasureValue") Then colActivityTopDepthHeightMeasureValue = I + If aRecord(I).StartsWith("ActivityTopDepthHeightMeasure/MeasureUnitCode") Then colActivityTopDepthHeightMeasureUnitCode = I + If aRecord(I).StartsWith("ActivityBottomDepthHeightMeasure/MeasureValue") Then colActivityBottomDepthHeightMeasureValue = I + If aRecord(I).StartsWith("ActivityBottomDepthHeightMeasure/MeasureUnitCode") Then colActivityBottomDepthHeightMeasureUnitCode = I + If aRecord(I).StartsWith("ProjectIdentifier") Then colProjectIdentifier = I + If aRecord(I).StartsWith("ActivityConductingOrganizationText") Then colActivityConductingOrganizationText = I + If aRecord(I).StartsWith("MonitoringLocationIdentifier") Then colMonitoringLocationIdentifier = I + If aRecord(I).StartsWith("ActivityCommentText") Then colActivityCommentText = I + If aRecord(I).StartsWith("SampleAquifer") Then colSampleAquifer = I + If aRecord(I).StartsWith("HydrologicCondition") Then colHydrologicCondition = I + If aRecord(I).StartsWith("HydrologicEvent") Then colHydrologicEvent = I + If aRecord(I).StartsWith("SampleCollectionMethod/MethodIdentifier") Then colSampleCollectionMethodIdentifier = I + If aRecord(I).StartsWith("SampleCollectionMethod/MethodIdentifierContext") Then colSampleCollectionMethodIdentifierContext = I + If aRecord(I).StartsWith("SampleCollectionMethod/MethodName") Then colSampleCollectionMethodName = I + If aRecord(I).StartsWith("SampleCollectionEquipmentName") Then colSampleCollectionEquipmentName = I + If aRecord(I).StartsWith("ResultDetectionConditionText") Then colResultDetectionConditionText = I + If aRecord(I).StartsWith("CharacteristicName") Then colCharacteristicName = I + If aRecord(I).StartsWith("ResultSampleFractionText") Then colResultSampleFractionText = I + If aRecord(I).StartsWith("ResultMeasureValue") Then colResultMeasureValue = I + If aRecord(I).StartsWith("ResultMeasure/MeasureUnitCode") Then colResultMeasureUnitCode = I + If aRecord(I).StartsWith("MeasureQualifierCode") Then colMeasureQualifierCode = I + If aRecord(I).StartsWith("ResultStatusIdentifier") Then colResultStatusIdentifier = I + If aRecord(I).StartsWith("StatisticalBaseCode") Then colStatisticalBaseCode = I + If aRecord(I).StartsWith("ResultValueTypeName") Then colResultValueTypeName = I + If aRecord(I).StartsWith("ResultWeightBasisText") Then colResultWeightBasisText = I + If aRecord(I).StartsWith("ResultTimeBasisText") Then colResultTimeBasisText = I + If aRecord(I).StartsWith("ResultTemperatureBasisText") Then colResultTemperatureBasisText = I + If aRecord(I).StartsWith("ResultParticleSizeBasisText") Then colResultParticleSizeBasisText = I + If aRecord(I).StartsWith("PrecisionValue") Then colPrecisionValue = I + If aRecord(I).StartsWith("ResultCommentText") Then colResultCommentText = I + If aRecord(I).StartsWith("USGSPCode") Then colUSGSPCode = I + If aRecord(I).StartsWith("ResultDepthHeightMeasure/MeasureValue") Then colResultDepthHeightMeasureValue = I + If aRecord(I).StartsWith("ResultDepthHeightMeasure/MeasureUnitCode") Then colResultDepthHeightMeasureUnitCode = I + If aRecord(I).StartsWith("ResultDepthAltitudeReferencePointText") Then colResultDepthAltitudeReferencePointText = I + If aRecord(I).StartsWith("SubjectTaxonomicName") Then colSubjectTaxonomicName = I + If aRecord(I).StartsWith("SampleTissueAnatomyName") Then colSampleTissueAnatomyName = I + If aRecord(I).StartsWith("ResultAnalyticalMethod/MethodIdentifier") Then colResultAnalyticalMethodIdentifier = I + If aRecord(I).StartsWith("ResultAnalyticalMethod/MethodIdentifierContext") Then colResultAnalyticalMethodIdentifierContext = I + If aRecord(I).StartsWith("ResultAnalyticalMethod/MethodName") Then colResultAnalyticalMethodName = I + If aRecord(I).StartsWith("MethodDescriptionText") Then colMethodDescriptionText = I + If aRecord(I).StartsWith("LaboratoryName") Then colLaboratoryName = I + If aRecord(I).StartsWith("AnalysisStartDate") Then colAnalysisStartDate = I + If aRecord(I).StartsWith("ResultLaboratoryCommentText") Then colResultLaboratoryCommentText = I + If aRecord(I).StartsWith("DetectionQuantitationLimitTypeName") Then colDetectionQuantitationLimitTypeName = I + If aRecord(I).StartsWith("DetectionQuantitationLimitMeasure/MeasureValue") Then colDetectionQuantitationLimitMeasureValue = I + If aRecord(I).StartsWith("DetectionQuantitationLimitMeasure/MeasureUnitCode") Then colDetectionQuantitationLimitMeasureUnitCode = I + If aRecord(I).StartsWith("PreparationStartDate") Then colPreparationStartDate = I + If aRecord(I).StartsWith("ProviderName") Then colProviderName = I + Next + Return IsValidColumns() + End Function + + Public Shared Function IsValidColumns() As Boolean + If colOrganizationIdentifier < 0 Then Return False + If colOrganizationFormalName < 0 Then Return False + If colActivityIdentifier < 0 Then Return False + If colActivityTypeCode < 0 Then Return False + If colActivityMediaName < 0 Then Return False + If colActivityMediaSubdivisionName < 0 Then Return False + If colActivityStartDate < 0 Then Return False + If colActivityStartTime < 0 Then Return False + If colActivityStartTimeZoneCode < 0 Then Return False + If colActivityEndDate < 0 Then Return False + If colActivityEndTime < 0 Then Return False + If colActivityEndTimeZoneCode < 0 Then Return False + If colActivityDepthHeightMeasureValue < 0 Then Return False + If colActivityDepthHeightMeasureUnitCode < 0 Then Return False + If colActivityDepthAltitudeReferencePointText < 0 Then Return False + If colActivityTopDepthHeightMeasureValue < 0 Then Return False + If colActivityTopDepthHeightMeasureUnitCode < 0 Then Return False + If colActivityBottomDepthHeightMeasureValue < 0 Then Return False + If colActivityBottomDepthHeightMeasureUnitCode < 0 Then Return False + If colProjectIdentifier < 0 Then Return False + If colActivityConductingOrganizationText < 0 Then Return False + If colMonitoringLocationIdentifier < 0 Then Return False + If colActivityCommentText < 0 Then Return False + If colSampleAquifer < 0 Then Return False + If colHydrologicCondition < 0 Then Return False + If colHydrologicEvent < 0 Then Return False + If colSampleCollectionMethodIdentifier < 0 Then Return False + If colSampleCollectionMethodIdentifierContext < 0 Then Return False + If colSampleCollectionMethodName < 0 Then Return False + If colSampleCollectionEquipmentName < 0 Then Return False + If colResultDetectionConditionText < 0 Then Return False + If colCharacteristicName < 0 Then Return False + If colResultSampleFractionText < 0 Then Return False + If colResultMeasureValue < 0 Then Return False + If colResultMeasureUnitCode < 0 Then Return False + If colMeasureQualifierCode < 0 Then Return False + If colResultStatusIdentifier < 0 Then Return False + If colStatisticalBaseCode < 0 Then Return False + If colResultValueTypeName < 0 Then Return False + If colResultWeightBasisText < 0 Then Return False + If colResultTimeBasisText < 0 Then Return False + If colResultTemperatureBasisText < 0 Then Return False + If colResultParticleSizeBasisText < 0 Then Return False + If colPrecisionValue < 0 Then Return False + If colResultCommentText < 0 Then Return False + If colUSGSPCode < 0 Then Return False + If colResultDepthHeightMeasureValue < 0 Then Return False + If colResultDepthHeightMeasureUnitCode < 0 Then Return False + If colResultDepthAltitudeReferencePointText < 0 Then Return False + If colSubjectTaxonomicName < 0 Then Return False + If colSampleTissueAnatomyName < 0 Then Return False + If colResultAnalyticalMethodIdentifier < 0 Then Return False + If colResultAnalyticalMethodIdentifierContext < 0 Then Return False + If colResultAnalyticalMethodName < 0 Then Return False + If colMethodDescriptionText < 0 Then Return False + If colLaboratoryName < 0 Then Return False + If colAnalysisStartDate < 0 Then Return False + If colResultLaboratoryCommentText < 0 Then Return False + If colDetectionQuantitationLimitTypeName < 0 Then Return False + If colDetectionQuantitationLimitMeasureValue < 0 Then Return False + If colDetectionQuantitationLimitMeasureUnitCode < 0 Then Return False + If colPreparationStartDate < 0 Then Return False + If colProviderName < 0 Then Return False + Return True + End Function +End Class + +Public Class clsWaterQualityDataUSRecord + Public OrganizationIdentifier As String = "" + Public OrganizationFormalName As String = "" + Public ActivityIdentifier As String = "" + Public ActivityTypeCode As String = "" + Public ActivityMediaName As String = "" + Public ActivityMediaSubdivisionName As String = "" + Public ActivityStartDate As String = "" + Public ActivityStartTime As String = "" + Public ActivityStartTimeZoneCode As String = "" + Public ActivityEndDate As String = "" + Public ActivityEndTime As String = "" + Public ActivityEndTimeZoneCode As String = "" + Public ActivityDepthHeightMeasureValue As String = "" + Public ActivityDepthHeightMeasureUnitCode As String = "" + Public ActivityDepthAltitudeReferencePointText As String = "" + Public ActivityTopDepthHeightMeasureValue As String = "" + Public ActivityTopDepthHeightMeasureUnitCode As String = "" + Public ActivityBottomDepthHeightMeasureValue As String = "" + Public ActivityBottomDepthHeightMeasureUnitCode As String = "" + Public ProjectIdentifier As String = "" + Public ActivityConductingOrganizationText As String = "" + Public MonitoringLocationIdentifier As String = "" + Public ActivityCommentText As String = "" + Public SampleAquifer As String = "" + Public HydrologicCondition As String = "" + Public HydrologicEvent As String = "" + Public SampleCollectionMethodIdentifier As String = "" + Public SampleCollectionMethodIdentifierContext As String = "" + Public SampleCollectionMethodName As String = "" + Public SampleCollectionEquipmentName As String = "" + Public ResultDetectionConditionText As String = "" + Public CharacteristicName As String = "" + Public ResultSampleFractionText As String = "" + Public ResultMeasureValue As String = "" + Public ResultMeasureUnitCode As String = "" + Public MeasureQualifierCode As String = "" + Public ResultStatusIdentifier As String = "" + Public StatisticalBaseCode As String = "" + Public ResultValueTypeName As String = "" + Public ResultWeightBasisText As String = "" + Public ResultTimeBasisText As String = "" + Public ResultTemperatureBasisText As String = "" + Public ResultParticleSizeBasisText As String = "" + Public PrecisionValue As String = "" + Public ResultCommentText As String = "" + Public USGSPCode As String = "" + Public ResultDepthHeightMeasureValue As String = "" + Public ResultDepthHeightMeasureUnitCode As String = "" + Public ResultDepthAltitudeReferencePointText As String = "" + Public SubjectTaxonomicName As String = "" + Public SampleTissueAnatomyName As String = "" + Public ResultAnalyticalMethodIdentifier As String = "" + Public ResultAnalyticalMethodIdentifierContext As String = "" + Public ResultAnalyticalMethodName As String = "" + Public MethodDescriptionText As String = "" + Public LaboratoryName As String = "" + Public AnalysisStartDate As String = "" + Public ResultLaboratoryCommentText As String = "" + Public DetectionQuantitationLimitTypeName As String = "" + Public DetectionQuantitationLimitMeasureValue As String = "" + Public DetectionQuantitationLimitMeasureUnitCode As String = "" + Public PreparationStartDate As String = "" + Public ProviderName As String = "" + Public Sub New(ByVal aRecord() As String) + OrganizationIdentifier = aRecord(clsWQDUSColumns.colOrganizationIdentifier) + OrganizationFormalName = aRecord(clsWQDUSColumns.colOrganizationFormalName) + ActivityIdentifier = aRecord(clsWQDUSColumns.colActivityIdentifier) + ActivityTypeCode = aRecord(clsWQDUSColumns.colActivityTypeCode) + ActivityMediaName = aRecord(clsWQDUSColumns.colActivityMediaName) + ActivityMediaSubdivisionName = aRecord(clsWQDUSColumns.colActivityMediaSubdivisionName) + ActivityStartDate = aRecord(clsWQDUSColumns.colActivityStartDate) + ActivityStartTime = aRecord(clsWQDUSColumns.colActivityStartTime) + ActivityStartTimeZoneCode = aRecord(clsWQDUSColumns.colActivityStartTimeZoneCode) + ActivityEndDate = aRecord(clsWQDUSColumns.colActivityEndDate) + ActivityEndTime = aRecord(clsWQDUSColumns.colActivityEndTime) + ActivityEndTimeZoneCode = aRecord(clsWQDUSColumns.colActivityEndTimeZoneCode) + ActivityDepthHeightMeasureValue = aRecord(clsWQDUSColumns.colActivityDepthHeightMeasureValue) + ActivityDepthHeightMeasureUnitCode = aRecord(clsWQDUSColumns.colActivityDepthHeightMeasureUnitCode) + ActivityDepthAltitudeReferencePointText = aRecord(clsWQDUSColumns.colActivityDepthAltitudeReferencePointText) + ActivityTopDepthHeightMeasureValue = aRecord(clsWQDUSColumns.colActivityTopDepthHeightMeasureValue) + ActivityTopDepthHeightMeasureUnitCode = aRecord(clsWQDUSColumns.colActivityTopDepthHeightMeasureUnitCode) + ActivityBottomDepthHeightMeasureValue = aRecord(clsWQDUSColumns.colActivityBottomDepthHeightMeasureValue) + ActivityBottomDepthHeightMeasureUnitCode = aRecord(clsWQDUSColumns.colActivityBottomDepthHeightMeasureUnitCode) + ProjectIdentifier = aRecord(clsWQDUSColumns.colProjectIdentifier) + ActivityConductingOrganizationText = aRecord(clsWQDUSColumns.colActivityConductingOrganizationText) + MonitoringLocationIdentifier = aRecord(clsWQDUSColumns.colMonitoringLocationIdentifier) + ActivityCommentText = aRecord(clsWQDUSColumns.colActivityCommentText) + SampleAquifer = aRecord(clsWQDUSColumns.colSampleAquifer) + HydrologicCondition = aRecord(clsWQDUSColumns.colHydrologicCondition) + HydrologicEvent = aRecord(clsWQDUSColumns.colHydrologicEvent) + SampleCollectionMethodIdentifier = aRecord(clsWQDUSColumns.colSampleCollectionMethodIdentifier) + SampleCollectionMethodIdentifierContext = aRecord(clsWQDUSColumns.colSampleCollectionMethodIdentifierContext) + SampleCollectionMethodName = aRecord(clsWQDUSColumns.colSampleCollectionMethodName) + SampleCollectionEquipmentName = aRecord(clsWQDUSColumns.colSampleCollectionEquipmentName) + ResultDetectionConditionText = aRecord(clsWQDUSColumns.colResultDetectionConditionText) + CharacteristicName = aRecord(clsWQDUSColumns.colCharacteristicName) + ResultSampleFractionText = aRecord(clsWQDUSColumns.colResultSampleFractionText) + ResultMeasureValue = aRecord(clsWQDUSColumns.colResultMeasureValue) + ResultMeasureUnitCode = aRecord(clsWQDUSColumns.colResultMeasureUnitCode) + MeasureQualifierCode = aRecord(clsWQDUSColumns.colMeasureQualifierCode) + ResultStatusIdentifier = aRecord(clsWQDUSColumns.colResultStatusIdentifier) + StatisticalBaseCode = aRecord(clsWQDUSColumns.colStatisticalBaseCode) + ResultValueTypeName = aRecord(clsWQDUSColumns.colResultValueTypeName) + ResultWeightBasisText = aRecord(clsWQDUSColumns.colResultWeightBasisText) + ResultTimeBasisText = aRecord(clsWQDUSColumns.colResultTimeBasisText) + ResultTemperatureBasisText = aRecord(clsWQDUSColumns.colResultTemperatureBasisText) + ResultParticleSizeBasisText = aRecord(clsWQDUSColumns.colResultParticleSizeBasisText) + PrecisionValue = aRecord(clsWQDUSColumns.colPrecisionValue) + ResultCommentText = aRecord(clsWQDUSColumns.colResultCommentText) + USGSPCode = aRecord(clsWQDUSColumns.colUSGSPCode) + ResultDepthHeightMeasureValue = aRecord(clsWQDUSColumns.colResultDepthHeightMeasureValue) + ResultDepthHeightMeasureUnitCode = aRecord(clsWQDUSColumns.colResultDepthHeightMeasureUnitCode) + ResultDepthAltitudeReferencePointText = aRecord(clsWQDUSColumns.colResultDepthAltitudeReferencePointText) + SubjectTaxonomicName = aRecord(clsWQDUSColumns.colSubjectTaxonomicName) + SampleTissueAnatomyName = aRecord(clsWQDUSColumns.colSampleTissueAnatomyName) + ResultAnalyticalMethodIdentifier = aRecord(clsWQDUSColumns.colResultAnalyticalMethodIdentifier) + ResultAnalyticalMethodIdentifierContext = aRecord(clsWQDUSColumns.colResultAnalyticalMethodIdentifierContext) + ResultAnalyticalMethodName = aRecord(clsWQDUSColumns.colResultAnalyticalMethodName) + MethodDescriptionText = aRecord(clsWQDUSColumns.colMethodDescriptionText) + LaboratoryName = aRecord(clsWQDUSColumns.colLaboratoryName) + AnalysisStartDate = aRecord(clsWQDUSColumns.colAnalysisStartDate) + ResultLaboratoryCommentText = aRecord(clsWQDUSColumns.colResultLaboratoryCommentText) + DetectionQuantitationLimitTypeName = aRecord(clsWQDUSColumns.colDetectionQuantitationLimitTypeName) + DetectionQuantitationLimitMeasureValue = aRecord(clsWQDUSColumns.colDetectionQuantitationLimitMeasureValue) + DetectionQuantitationLimitMeasureUnitCode = aRecord(clsWQDUSColumns.colDetectionQuantitationLimitMeasureUnitCode) + PreparationStartDate = aRecord(clsWQDUSColumns.colPreparationStartDate) + ProviderName = aRecord(clsWQDUSColumns.colProviderName) + End Sub +End Class + +Public Class clsWQDUSLocations + Public Locations As New Dictionary(Of String, clsWQDUSLocation)() + Public ReadOnly Property GetUniqueConstituentList() As List(Of String) + Get + Dim lst As New List(Of String)() + For Each loc As clsWQDUSLocation In Locations.Values + For Each cons As clsWQDUSConstituent In loc.Constituents.Values + For Each ldata_unit As String In cons.RecordGroup.Keys + If Not lst.Contains(cons.Name & "-" & ldata_unit) Then + lst.Add(cons.Name & "-" & ldata_unit) + End If + Next + Next + Next + Return lst + End Get + End Property + + Public ReadOnly Property ContainsKey(ByVal aKey As String) As Boolean + Get + Return Locations.ContainsKey(aKey) + End Get + End Property + Public ReadOnly Property Count() As Integer + Get + Return Locations.Count + End Get + End Property + Public ReadOnly Property Keys() As List(Of String) + Get + Return Locations.Keys.ToList() + End Get + End Property + Public ReadOnly Property Values() As List(Of clsWQDUSLocation) + Get + Return Locations.Values.ToList() + End Get + End Property + Public ReadOnly Property Item(ByVal aLoc As String) As clsWQDUSLocation + Get + Return Locations.Item(aLoc) + End Get + End Property + Public Function Add(ByVal aLocID As String, ByVal aLoc As clsWQDUSLocation) As Boolean + Try + Locations.Add(aLocID, aLoc) + Return True + Catch ex As Exception + Return False + End Try + End Function +End Class +''' +''' A location group of records of different constituents and time/value pairs +''' +Public Class clsWQDUSLocation + Public Location As String = "" + Public Constituents As New Dictionary(Of String, clsWQDUSConstituent)() + Public Sub New(ByVal aLoc As String) + Location = aLoc + End Sub + Public ReadOnly Property DataKeys() As List(Of String) + Get + Dim lst As New List(Of String)() + For Each lcon As clsWQDUSConstituent In Constituents.Values + lst.AddRange(lcon.DataKeys()) + Next + Return lst + End Get + End Property + Public Sub AddData(ByVal aRecord() As String) + Dim lname As String = aRecord(clsWQDUSColumns.colCharacteristicName) + Dim lunit As String = aRecord(clsWQDUSColumns.colResultMeasureUnitCode) + + 'For I As Integer = 0 To aRecord.Length - 1 + ' If aRecord(I) = "Nitrate as N" Then + ' Dim lfound As String = "Found" + ' End If + 'Next + + If Not String.IsNullOrEmpty(lname) AndAlso lname.ToLower() = "nitrate as n" Then + lname = "Nitrate" + aRecord(clsWQDUSColumns.colCharacteristicName) = lname + If lunit = "mg/l" Then + lunit = "mg/l as N" + aRecord(clsWQDUSColumns.colResultMeasureUnitCode) = lunit + End If + End If + If Not Constituents.ContainsKey(lname) Then + Constituents.Add(lname, New clsWQDUSConstituent(lname)) + End If + Constituents.Item(lname).AddData(aRecord) + End Sub +End Class + +Public Class clsWQDUSConstituent + Public Selected As Boolean = False + Public Name As String = "" + ' unit -> records of data points + Public RecordGroup As New Dictionary(Of String, List(Of clsWQDUSDataPoint))() + Public ReadOnly Property Unit() As String + Get + If RecordGroup.Count = 0 Then + Return "" + Else + Return RecordGroup(0).Item(0).Unit + End If + Return "" + End Get + End Property + Public ReadOnly Property Units() As List(Of String) + Get + Return RecordGroup.Keys().ToList() + End Get + End Property + Public ReadOnly Property DataKeys() As List(Of String) + Get + Dim lst As New List(Of String)() + For Each lunit As String In RecordGroup.Keys() + lst.Add(Name & "-" & lunit) + Next + Return lst + End Get + End Property + Public Sub New(ByVal aName As String) + Name = aName + End Sub + Public Function AddData(ByVal aRecord() As String) As Boolean + Dim lFoundValue As Boolean = False + Dim lDataPoint As New clsWQDUSDataPoint() + With lDataPoint + .sDate = aRecord(clsWQDUSColumns.colActivityStartDate) + .sTime = aRecord(clsWQDUSColumns.colActivityStartTime) + If Not String.IsNullOrEmpty(aRecord(clsWQDUSColumns.colResultMeasureValue)) Then + .Value = aRecord(clsWQDUSColumns.colResultMeasureValue) + .Unit = aRecord(clsWQDUSColumns.colResultMeasureUnitCode) + lFoundValue = True + ElseIf Not String.IsNullOrEmpty(aRecord(clsWQDUSColumns.colResultDepthHeightMeasureValue)) Then + .Value = aRecord(clsWQDUSColumns.colResultDepthHeightMeasureValue) + .Unit = aRecord(clsWQDUSColumns.colResultDepthHeightMeasureUnitCode) + lFoundValue = True + ElseIf Not String.IsNullOrEmpty(aRecord(clsWQDUSColumns.colDetectionQuantitationLimitMeasureValue)) Then + .Value = aRecord(clsWQDUSColumns.colDetectionQuantitationLimitMeasureValue) + .Unit = aRecord(clsWQDUSColumns.colDetectionQuantitationLimitMeasureUnitCode) + lFoundValue = True + End If + .Attrib = aRecord(clsWQDUSColumns.colMeasureQualifierCode) + If String.IsNullOrEmpty(.Attrib) Then + .Attrib = aRecord(clsWQDUSColumns.colResultStatusIdentifier) + End If + .Resulttype = aRecord(clsWQDUSColumns.colResultValueTypeName) + If lFoundValue Then + If Not RecordGroup.ContainsKey(.Unit) Then + RecordGroup.Add(.Unit, New List(Of clsWQDUSDataPoint)()) + End If + End If + End With + If lFoundValue Then + RecordGroup.Item(lDataPoint.Unit).Add(lDataPoint) + End If + Return lFoundValue + End Function +End Class + +Public Class clsWQDUSDataPoint + Public sDate As String + Public sTime As String + Public Value As String + Public Unit As String + Public Attrib As String + Public Resulttype As String + Public atcDataTime As Double = -1 + Public vbDataTime As DateTime + Public Selected As Boolean = False + Public Function SetDataTime() As Boolean + Try + Dim ldates(5) As Integer + If DateTime.TryParse(sDate & "," & sTime, vbDataTime) Then + ldates(0) = vbDataTime.Year + ldates(1) = vbDataTime.Month + ldates(2) = vbDataTime.Day + ldates(3) = vbDataTime.Hour + ldates(4) = vbDataTime.Minute + ldates(5) = vbDataTime.Second + ElseIf DateTime.TryParse(sDate, vbDataTime) Then + ldates(0) = vbDataTime.Year + ldates(1) = vbDataTime.Month + ldates(2) = vbDataTime.Day + ldates(3) = 24 + End If + atcDataTime = Date2J(ldates) + Catch ex As Exception + Return False + End Try + Return True + End Function +End Class + diff --git a/atcTimeseriesWaterQualUS/frmSelect.Designer.vb b/atcTimeseriesWaterQualUS/frmSelect.Designer.vb new file mode 100644 index 000000000..ef78c797d --- /dev/null +++ b/atcTimeseriesWaterQualUS/frmSelect.Designer.vb @@ -0,0 +1,181 @@ + _ +Partial Class frmSelect + Inherits System.Windows.Forms.Form + + 'Form overrides dispose to clean up the component list. + _ + Protected Overrides Sub Dispose(ByVal disposing As Boolean) + Try + If disposing AndAlso components IsNot Nothing Then + components.Dispose() + End If + Finally + MyBase.Dispose(disposing) + End Try + End Sub + + 'Required by the Windows Form Designer + Private components As System.ComponentModel.IContainer + + 'NOTE: The following procedure is required by the Windows Form Designer + 'It can be modified using the Windows Form Designer. + 'Do not modify it using the code editor. + _ + Private Sub InitializeComponent() + Me.lstLocations = New System.Windows.Forms.CheckedListBox() + Me.lstConstituents = New System.Windows.Forms.CheckedListBox() + Me.Label1 = New System.Windows.Forms.Label() + Me.Label2 = New System.Windows.Forms.Label() + Me.spaneMain = New System.Windows.Forms.SplitContainer() + Me.btnClearLoc = New System.Windows.Forms.Button() + Me.txtMsgCons = New System.Windows.Forms.TextBox() + Me.btnClearCons = New System.Windows.Forms.Button() + Me.btnDoTser = New System.Windows.Forms.Button() + Me.btnCancel = New System.Windows.Forms.Button() + Me.spaneMain.Panel1.SuspendLayout() + Me.spaneMain.Panel2.SuspendLayout() + Me.spaneMain.SuspendLayout() + Me.SuspendLayout() + ' + 'lstLocations + ' + Me.lstLocations.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.lstLocations.FormattingEnabled = True + Me.lstLocations.Location = New System.Drawing.Point(6, 19) + Me.lstLocations.Name = "lstLocations" + Me.lstLocations.Size = New System.Drawing.Size(313, 259) + Me.lstLocations.TabIndex = 0 + ' + 'lstConstituents + ' + Me.lstConstituents.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.lstConstituents.FormattingEnabled = True + Me.lstConstituents.Location = New System.Drawing.Point(6, 19) + Me.lstConstituents.Name = "lstConstituents" + Me.lstConstituents.Size = New System.Drawing.Size(317, 259) + Me.lstConstituents.TabIndex = 1 + ' + 'Label1 + ' + Me.Label1.AutoSize = True + Me.Label1.Location = New System.Drawing.Point(3, 3) + Me.Label1.Name = "Label1" + Me.Label1.Size = New System.Drawing.Size(53, 13) + Me.Label1.TabIndex = 2 + Me.Label1.Text = "Locations" + ' + 'Label2 + ' + Me.Label2.AutoSize = True + Me.Label2.Location = New System.Drawing.Point(3, 3) + Me.Label2.Name = "Label2" + Me.Label2.Size = New System.Drawing.Size(65, 13) + Me.Label2.TabIndex = 3 + Me.Label2.Text = "Constituents" + ' + 'spaneMain + ' + Me.spaneMain.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.spaneMain.Location = New System.Drawing.Point(12, 12) + Me.spaneMain.Name = "spaneMain" + ' + 'spaneMain.Panel1 + ' + Me.spaneMain.Panel1.Controls.Add(Me.btnClearLoc) + Me.spaneMain.Panel1.Controls.Add(Me.lstLocations) + Me.spaneMain.Panel1.Controls.Add(Me.Label1) + ' + 'spaneMain.Panel2 + ' + Me.spaneMain.Panel2.Controls.Add(Me.txtMsgCons) + Me.spaneMain.Panel2.Controls.Add(Me.btnClearCons) + Me.spaneMain.Panel2.Controls.Add(Me.lstConstituents) + Me.spaneMain.Panel2.Controls.Add(Me.Label2) + Me.spaneMain.Size = New System.Drawing.Size(658, 398) + Me.spaneMain.SplitterDistance = 325 + Me.spaneMain.TabIndex = 4 + ' + 'btnClearLoc + ' + Me.btnClearLoc.Location = New System.Drawing.Point(6, 285) + Me.btnClearLoc.Name = "btnClearLoc" + Me.btnClearLoc.Size = New System.Drawing.Size(50, 23) + Me.btnClearLoc.TabIndex = 3 + Me.btnClearLoc.Text = "Clear" + Me.btnClearLoc.UseVisualStyleBackColor = True + ' + 'txtMsgCons + ' + Me.txtMsgCons.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ + Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.txtMsgCons.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle + Me.txtMsgCons.Location = New System.Drawing.Point(59, 285) + Me.txtMsgCons.Multiline = True + Me.txtMsgCons.Name = "txtMsgCons" + Me.txtMsgCons.ReadOnly = True + Me.txtMsgCons.ScrollBars = System.Windows.Forms.ScrollBars.Vertical + Me.txtMsgCons.Size = New System.Drawing.Size(264, 110) + Me.txtMsgCons.TabIndex = 5 + ' + 'btnClearCons + ' + Me.btnClearCons.Location = New System.Drawing.Point(6, 285) + Me.btnClearCons.Name = "btnClearCons" + Me.btnClearCons.Size = New System.Drawing.Size(50, 23) + Me.btnClearCons.TabIndex = 4 + Me.btnClearCons.Text = "Clear" + Me.btnClearCons.UseVisualStyleBackColor = True + ' + 'btnDoTser + ' + Me.btnDoTser.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.btnDoTser.Location = New System.Drawing.Point(491, 416) + Me.btnDoTser.Name = "btnDoTser" + Me.btnDoTser.Size = New System.Drawing.Size(98, 23) + Me.btnDoTser.TabIndex = 5 + Me.btnDoTser.Text = "Make Timeseries" + Me.btnDoTser.UseVisualStyleBackColor = True + ' + 'btnCancel + ' + Me.btnCancel.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) + Me.btnCancel.Location = New System.Drawing.Point(595, 416) + Me.btnCancel.Name = "btnCancel" + Me.btnCancel.Size = New System.Drawing.Size(75, 23) + Me.btnCancel.TabIndex = 6 + Me.btnCancel.Text = "Cancel" + Me.btnCancel.UseVisualStyleBackColor = True + ' + 'frmSelect + ' + Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!) + Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font + Me.ClientSize = New System.Drawing.Size(682, 451) + Me.Controls.Add(Me.btnCancel) + Me.Controls.Add(Me.btnDoTser) + Me.Controls.Add(Me.spaneMain) + Me.Name = "frmSelect" + Me.Text = "Select Water Quality Data" + Me.spaneMain.Panel1.ResumeLayout(False) + Me.spaneMain.Panel1.PerformLayout() + Me.spaneMain.Panel2.ResumeLayout(False) + Me.spaneMain.Panel2.PerformLayout() + Me.spaneMain.ResumeLayout(False) + Me.ResumeLayout(False) + + End Sub + + Friend WithEvents lstConstituents As Windows.Forms.CheckedListBox + Friend WithEvents lstLocations As Windows.Forms.CheckedListBox + Friend WithEvents Label1 As Windows.Forms.Label + Friend WithEvents Label2 As Windows.Forms.Label + Friend WithEvents spaneMain As Windows.Forms.SplitContainer + Friend WithEvents btnClearLoc As Windows.Forms.Button + Friend WithEvents btnClearCons As Windows.Forms.Button + Friend WithEvents btnDoTser As Windows.Forms.Button + Friend WithEvents btnCancel As Windows.Forms.Button + Friend WithEvents txtMsgCons As Windows.Forms.TextBox +End Class diff --git a/atcTimeseriesWaterQualUS/frmSelect.resx b/atcTimeseriesWaterQualUS/frmSelect.resx new file mode 100644 index 000000000..7080a7d11 --- /dev/null +++ b/atcTimeseriesWaterQualUS/frmSelect.resx @@ -0,0 +1,120 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/atcTimeseriesWaterQualUS/frmSelect.vb b/atcTimeseriesWaterQualUS/frmSelect.vb new file mode 100644 index 000000000..da5f60723 --- /dev/null +++ b/atcTimeseriesWaterQualUS/frmSelect.vb @@ -0,0 +1,104 @@ +Imports System.Windows.Forms + +Public Class frmSelect + Private pRawDataGroup As clsWQDUSLocations + Private pSelectedLocations As List(Of String) + Private pSelectedConstituents As List(Of String) + + Public Sub New(ByVal aRawDataGroup As clsWQDUSLocations, + ByRef aSelectedLocations As List(Of String), + ByRef aSelectedConstituents As List(Of String)) + + ' This call is required by the designer. + InitializeComponent() + + ' Add any initialization after the InitializeComponent() call. + pRawDataGroup = aRawDataGroup + pSelectedLocations = aSelectedLocations + pSelectedConstituents = aSelectedConstituents + PopulateData(pRawDataGroup) + End Sub + + Public Sub PopulateData(ByVal aRawDataGroup As clsWQDUSLocations) + Dim lSortedList As New SortedList(Of String, Integer)() + For Each loc As String In aRawDataGroup.Keys() + lSortedList.Add(loc, 0) + Next + For Each loc As String In lSortedList.Keys + lstLocations.Items().Add(loc) + Next + lSortedList.Clear() + For Each cons As String In aRawDataGroup.GetUniqueConstituentList() + lSortedList.Add(cons, 0) + Next + For Each cons As String In lSortedList.Keys + lstConstituents.Items().Add(cons) + Next + End Sub + + Private Sub btnClearLoc_Click(sender As Object, e As EventArgs) Handles btnClearLoc.Click + For Each ind As Integer In lstLocations.CheckedIndices + lstLocations.SetItemChecked(ind, False) + Next + End Sub + + Private Sub btnClearCons_Click(sender As Object, e As EventArgs) Handles btnClearCons.Click + For Each ind As Integer In lstConstituents.CheckedIndices + lstConstituents.SetItemChecked(ind, False) + Next + End Sub + + Private Sub lstConstituents_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles lstConstituents.ItemCheck + If e.NewValue = CheckState.Checked Then + If Not pSelectedConstituents.Contains(lstConstituents.SelectedItem.ToString()) Then + pSelectedConstituents.Add(lstConstituents.SelectedItem.ToString()) + End If + Else + If pSelectedConstituents.Contains(lstConstituents.SelectedItem.ToString()) Then + pSelectedConstituents.Remove(lstConstituents.SelectedItem.ToString()) + End If + End If + End Sub + Private Sub lstLocations_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles lstLocations.ItemCheck + txtMsgCons.Text = "" + If e.NewValue = CheckState.Checked Then + If Not pSelectedLocations.Contains(lstLocations.SelectedItem.ToString()) Then + pSelectedLocations.Add(lstLocations.SelectedItem.ToString()) + End If + Dim loc As clsWQDUSLocation = pRawDataGroup.Item(lstLocations.SelectedItem) + Dim cons As List(Of String) = loc.DataKeys() + Dim lnalist As New List(Of String)() + For Each Item As String In lstConstituents.CheckedItems + If Not cons.Contains(Item) Then + lnalist.Add(Item) + End If + Next + Dim lmsg As String = loc.Location & " has none of the following:" & vbCrLf + If lnalist.Count > 0 Then + For Each itm As String In lnalist + lmsg &= itm & vbCrLf + Next + txtMsgCons.Text = lmsg + End If + Else + If pSelectedLocations.Contains(lstLocations.SelectedItem.ToString()) Then + pSelectedLocations.Remove(lstLocations.SelectedItem.ToString()) + End If + End If + End Sub + + Private Sub btnCancel_Click(sender As Object, e As EventArgs) Handles btnCancel.Click + lstLocations.ClearSelected() + lstConstituents.ClearSelected() + lstLocations.Items.Clear() + lstConstituents.Items.Clear() + Me.DialogResult = DialogResult.Cancel + Close() + End Sub + + Private Sub btnDoTser_Click(sender As Object, e As EventArgs) Handles btnDoTser.Click + Me.DialogResult = DialogResult.OK + Close() + End Sub + +End Class \ No newline at end of file From 64cbb723fee13ecf47e9d60015713d02ec7ecd67 Mon Sep 17 00:00:00 2001 From: "tong.zhai" Date: Sat, 3 Mar 2018 11:42:27 -0500 Subject: [PATCH 07/14] additional project files WQDUS --- .../My Project/Application.Designer.vb | 13 ++ .../My Project/AssemblyInfo.vb | 35 ++++++ .../My Project/Resources.Designer.vb | 63 ++++++++++ .../My Project/Resources.resx | 117 ++++++++++++++++++ 4 files changed, 228 insertions(+) create mode 100644 atcTimeseriesWaterQualUS/My Project/Application.Designer.vb create mode 100644 atcTimeseriesWaterQualUS/My Project/AssemblyInfo.vb create mode 100644 atcTimeseriesWaterQualUS/My Project/Resources.Designer.vb create mode 100644 atcTimeseriesWaterQualUS/My Project/Resources.resx diff --git a/atcTimeseriesWaterQualUS/My Project/Application.Designer.vb b/atcTimeseriesWaterQualUS/My Project/Application.Designer.vb new file mode 100644 index 000000000..88dd01c78 --- /dev/null +++ b/atcTimeseriesWaterQualUS/My Project/Application.Designer.vb @@ -0,0 +1,13 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + diff --git a/atcTimeseriesWaterQualUS/My Project/AssemblyInfo.vb b/atcTimeseriesWaterQualUS/My Project/AssemblyInfo.vb new file mode 100644 index 000000000..f2952224a --- /dev/null +++ b/atcTimeseriesWaterQualUS/My Project/AssemblyInfo.vb @@ -0,0 +1,35 @@ +Imports System +Imports System.Reflection +Imports System.Runtime.InteropServices + +' General Information about an assembly is controlled through the following +' set of attributes. Change these attribute values to modify the information +' associated with an assembly. + +' Review the values of the assembly attributes + + + + + + + + + + +'The following GUID is for the ID of the typelib if this project is exposed to COM + + +' Version information for an assembly consists of the following four values: +' +' Major Version +' Minor Version +' Build Number +' Revision +' +' You can specify all the values or you can default the Build and Revision Numbers +' by using the '*' as shown below: +' + + + diff --git a/atcTimeseriesWaterQualUS/My Project/Resources.Designer.vb b/atcTimeseriesWaterQualUS/My Project/Resources.Designer.vb new file mode 100644 index 000000000..4ab4d6a31 --- /dev/null +++ b/atcTimeseriesWaterQualUS/My Project/Resources.Designer.vb @@ -0,0 +1,63 @@ +'------------------------------------------------------------------------------ +' +' This code was generated by a tool. +' Runtime Version:4.0.30319.42000 +' +' Changes to this file may cause incorrect behavior and will be lost if +' the code is regenerated. +' +'------------------------------------------------------------------------------ + +Option Strict On +Option Explicit On + +Imports System + +Namespace My.Resources + + 'This class was auto-generated by the StronglyTypedResourceBuilder + 'class via a tool like ResGen or Visual Studio. + 'To add or remove a member, edit your .ResX file then rerun ResGen + 'with the /str option, or rebuild your VS project. + ''' + ''' A strongly-typed resource class, for looking up localized strings, etc. + ''' + _ + Friend Module Resources + + Private resourceMan As Global.System.Resources.ResourceManager + + Private resourceCulture As Global.System.Globalization.CultureInfo + + ''' + ''' Returns the cached ResourceManager instance used by this class. + ''' + _ + Friend ReadOnly Property ResourceManager() As Global.System.Resources.ResourceManager + Get + If Object.ReferenceEquals(resourceMan, Nothing) Then + Dim temp As Global.System.Resources.ResourceManager = New Global.System.Resources.ResourceManager("atcTimeseriesWaterQualUS.Resources", GetType(Resources).Assembly) + resourceMan = temp + End If + Return resourceMan + End Get + End Property + + ''' + ''' Overrides the current thread's CurrentUICulture property for all + ''' resource lookups using this strongly typed resource class. + ''' + _ + Friend Property Culture() As Global.System.Globalization.CultureInfo + Get + Return resourceCulture + End Get + Set + resourceCulture = value + End Set + End Property + End Module +End Namespace diff --git a/atcTimeseriesWaterQualUS/My Project/Resources.resx b/atcTimeseriesWaterQualUS/My Project/Resources.resx new file mode 100644 index 000000000..af7dbebba --- /dev/null +++ b/atcTimeseriesWaterQualUS/My Project/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file From 7b242237029c8d21a48d10b747c754c304736d50 Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Tue, 6 Mar 2018 09:50:52 -0800 Subject: [PATCH 08/14] GQAL Calcualtion Update for HSPEXP+ 1. Started calculating of GQAL load based on MASS-LINK. 2. Started calculating reach budget. 3. Started calculating PS and GENER load for GQAL 4. Diversion are still not calculated for GQAL. 5. Suppressed other reports for GQAL accept the land loadings and reach budget. --- HSPEXP/HSPFOutputReports.vb | 29 +- atcHspfSupport/atcConstituentTables.vb | 250 +++++++++++++++--- atcHspfSupport/modUtility.vb | 113 ++++---- ...sWaterQualUS15.vbproj.FileListAbsolute.txt | 10 + 4 files changed, 295 insertions(+), 107 deletions(-) create mode 100644 atcTimeseriesWaterQualUS/obj/x86/Debug/atcTimeseriesWaterQualUS15.vbproj.FileListAbsolute.txt diff --git a/HSPEXP/HSPFOutputReports.vb b/HSPEXP/HSPFOutputReports.vb index ddde8db75..e4a8921d0 100644 --- a/HSPEXP/HSPFOutputReports.vb +++ b/HSPEXP/HSPFOutputReports.vb @@ -460,7 +460,7 @@ Module HSPFOutputReports Dim lConstituentName As String = "" Dim lActiveSections As New List(Of String) Dim CheckQUALID As Boolean = False - Dim GQALID As Integer = 0 + Dim lGQALID As Integer = 0 Select Case lConstituent Case "Water" lConstituentName = "WAT" @@ -511,30 +511,17 @@ Module HSPFOutputReports lActiveSections.Add("NUTRX") lActiveSections.Add("PLANK") Case Else - lConstituentName = lConstituent - lConstProperties = Utility.LocateConstituentNames(aHspfUci, lConstituent) + lGQALID = Right(lConstituent, 1) + lConstituentName = SafeSubstring(lConstituent, 0, lConstituent.Length - 2) + lConstProperties = Utility.LocateConstituentNames(aHspfUci, lConstituentName, lGQALID) lActiveSections.Add("PQUAL") lActiveSections.Add("IQUAL") lActiveSections.Add("GQUAL") - GQALID = Right(lConstituent, 1) + End Select Dim lScenarioResults As New atcDataSource - 'If lOpenHspfBinDataSource.DataSets.Count > 1 Then - ' Dim lConstituentsToOutput As atcCollection = Utility.ConstituentsToOutput(lConstituent, lConstProperties) - ' For Each ConstituentForAnalysis As String In lConstituentsToOutput.Keys - ' Dim OpnType As String = SafeSubstring(ConstituentForAnalysis, 0, 2) - ' ConstituentForAnalysis = SafeSubstring(ConstituentForAnalysis, 2) - ' If Not OpnType = "R:" AndAlso (ConstituentForAnalysis.EndsWith("1") Or ConstituentForAnalysis.EndsWith("2")) Then - - ' ConstituentForAnalysis = Left(ConstituentForAnalysis, ConstituentForAnalysis.Length - 1) - ' End If - ' lScenarioResults.DataSets.Add(atcDataManager.DataSets.FindData("Constituent", ConstituentForAnalysis)) - - ' Next - - 'End If - + If lScenarioResults.DataSets.Count = 0 Then For Each activeSection As String In lActiveSections lScenarioResults.DataSets.Add(atcDataManager.DataSets.FindData("Section", activeSection)) @@ -548,8 +535,8 @@ Module HSPFOutputReports lReportCons = Nothing Dim lOutFileName As String = "" - LandLoadingReports(loutfoldername, lScenarioResults, aHspfUci, pBaseName, lRunMade, lConstituent, lConstProperties, SDateJ, EDateJ) - ReachBudgetReports(loutfoldername, lScenarioResults, aHspfUci, pBaseName, lRunMade, lConstituent, lConstProperties, SDateJ, EDateJ) + LandLoadingReports(loutfoldername, lScenarioResults, aHspfUci, pBaseName, lRunMade, lConstituentName, lConstProperties, SDateJ, EDateJ, lGQALID) + ReachBudgetReports(loutfoldername, lScenarioResults, aHspfUci, pBaseName, lRunMade, lConstituentName, lConstProperties, SDateJ, EDateJ, lGQALID) Logger.Status(Now & " Generating Reports for " & lConstituent) Logger.Dbg(Now & " Generating Reports for " & lConstituent) lReportCons = Nothing diff --git a/atcHspfSupport/atcConstituentTables.vb b/atcHspfSupport/atcConstituentTables.vb index 75af9317c..ecdebc6c2 100644 --- a/atcHspfSupport/atcConstituentTables.vb +++ b/atcHspfSupport/atcConstituentTables.vb @@ -13,8 +13,9 @@ Public Module atcConstituentTables ByVal aScenario As String, ByVal aRunMade As String, ByVal aBalanceType As String, - aConstProperties As List(Of ConstituentProperties), - aSDateJ As Double, aEDateJ As Double) + ByVal aConstProperties As List(Of ConstituentProperties), + ByVal aSDateJ As Double, ByVal aEDateJ As Double, + Optional ByVal aGQALID As Integer = 0) 'This Sub prepares a text report for constituents like TN and TP. Dim lReport As New atcReport.ReportText @@ -554,8 +555,7 @@ Public Module atcConstituentTables #Region "Case Else" Case Else - Dim column As DataColumn - 'Dim columnMonthly As DataColumn + Dim column As DataColumn Dim row As DataRow column = New DataColumn() @@ -594,13 +594,8 @@ Public Module atcConstituentTables column.Caption = "Unit" Land_Constituent_Monthly_Table.Columns.Add(column) - Land_Constituent_Monthly_Table = AddMonthlyColumnsColumns(Land_Constituent_Monthly_Table) - 'column = New DataColumn() - 'column.DataType = Type.GetType("System.Double") - 'column.ColumnName = "ATDEP" - 'column.Caption = "Atmospheric Deposition" - 'QUALConstTable.Columns.Add(column) - + Land_Constituent_Monthly_Table = AddMonthlyColumnsColumns(Land_Constituent_Monthly_Table) + column = New DataColumn() column.DataType = Type.GetType("System.Double") column.ColumnName = "WASHQS" @@ -650,8 +645,8 @@ Public Module atcConstituentTables lOperationNameNumber.Add(LocationName) - landUseNameForTheCollection = lOperation.Name.Substring(0, 1) & ":" & lOperation.Description - 'Look at this. Do not want operation id with this + landUseNameForTheCollection = lOperation.Name.Substring(0, 1) & ":" & lOperation.Description + If Not listLanduses.Contains(landUseNameForTheCollection) Then listLanduses.Add(landUseNameForTheCollection) End If @@ -713,13 +708,13 @@ Public Module atcConstituentTables aConversionFactor = ConversionFactorfromOxygen(aUCI, constituent.ReportType, aReach) End If Dim lMassLinkID As Integer = lConnection.MassLink - If Not lMassLinkID = 0 Then - lMassLinkFactor = FindMassLinkFactor(aUCI, lMassLinkID, lOutflowDataType, - constituent.ReportType, aConversionFactor, lMultipleIndex) - Exit For - End If - 'End If + If Not lMassLinkID = 0 Then + lMassLinkFactor = FindMassLinkFactor(aUCI, lMassLinkID, lOutflowDataType, + constituent.ReportType, aConversionFactor, lMultipleIndex, aGQALID) + Exit For End If + 'End If + End If Next lConnection End If @@ -965,15 +960,15 @@ Public Module atcConstituentTables Dim foundRows() As DataRow = Land_Constituent_Monthly_Table.Select(SelectExpression) If foundRows.Length > 0 Then For Each month As String In lMonthNames - Dim Values As New List(Of Double) - For Each MonthRow As DataRow In foundRows - Values.Add(MonthRow(month)) - Next - landUseSumAnnualValues.Add(Right(month, 3), Values.ToArray) - Next + Dim Values As New List(Of Double) + For Each MonthRow As DataRow In foundRows + Values.Add(MonthRow(month)) + Next + landUseSumAnnualValues.Add(Right(month, 3), Values.ToArray) + Next - lDataForBoxWhiskerPlot.LabelValueCollection = landUseSumAnnualValues - lDataForBoxWhiskerPlot.Units = "(" & lUnits & ")" + lDataForBoxWhiskerPlot.LabelValueCollection = landUseSumAnnualValues + lDataForBoxWhiskerPlot.Units = "(" & lUnits & ")" CreateGraph_BoxAndWhisker(lDataForBoxWhiskerPlot, AbsolutePath(System.IO.Path.Combine("MonthlyLoadings\" & aBalanceType & "_" & item.Split(":")(0) & "_" & item.Split(":")(1) & "_BoxWhisker.png"), aoutfoldername), "Monthly Loading Rate from Land Use " & item & "") @@ -994,7 +989,7 @@ Public Module atcConstituentTables ByVal aRunMade As String, ByVal aBalanceType As String, ByVal aConstProperties As List(Of ConstituentProperties), - ByVal aSDateJ As Double, ByVal aEDateJ As Double) + ByVal aSDateJ As Double, ByVal aEDateJ As Double, Optional aGQALID As Integer = 0) Dim lReport As New atcReport.ReportText Dim lUpstreamInflows As New atcCollection Dim lCumulativePointNonpointColl As New atcCollection @@ -1706,10 +1701,125 @@ Public Module atcConstituentTables Next lConstituent #End Region +#Region "Else Case" + Case Else + For Each lConstituent As ConstituentProperties In aConstProperties + lUnits = lConstituent.ConstituentUnit + + Dim column As DataColumn + Dim row As DataRow + Reach_Budget_Table = AddFirstSixColumnsReachBudget(Reach_Budget_Table, lUnits) + column = New DataColumn() + column.DataType = Type.GetType("System.Double") + column.ColumnName = aBalanceType & "-TIQAL" + column.Caption = "Total GQAL Inflow (" & lUnits & ")" + Reach_Budget_Table.Columns.Add(column) + + column = New DataColumn() + column.DataType = Type.GetType("System.Double") + column.ColumnName = aBalanceType & "-PDQAL" + column.Caption = "Input of QAL due to decay of parents (" & lUnits & ")" + Reach_Budget_Table.Columns.Add(column) + + column = New DataColumn() + column.DataType = Type.GetType("System.Double") + column.ColumnName = aBalanceType & "-GQADEP" + column.Caption = "Total Atmospheric deposition of QAL (" & lUnits & ")" + Reach_Budget_Table.Columns.Add(column) + + column = New DataColumn() + column.DataType = Type.GetType("System.Double") + column.ColumnName = aBalanceType & "-DDQAL-TOT" + column.Caption = "Decay of Dissolved QAL (" & lUnits & ")" + Reach_Budget_Table.Columns.Add(column) + + column = New DataColumn() + column.DataType = Type.GetType("System.Double") + column.ColumnName = aBalanceType & "-TROQAL" + column.Caption = "Total Outflow of QAL (" & lUnits & ")" + Reach_Budget_Table.Columns.Add(column) + + + For Each lReach As HspfOperation In aUCI.OpnSeqBlock.Opns + row = Reach_Budget_Table.NewRow + If Not lReach.Name = "RCHRES" Then Continue For + If Not lReach.Tables("ACTIVITY").Parms("HTFG").Value = "1" Then Continue For + Dim LocationName As String = lReach.Name.Substring(0, 1) & ":" & lReach.Id + 'Dim lOutflowDataTypes1 As String() = ConstituentListRCHRES(aBalanceType) + Dim lTS As New atcTimeseries(Nothing) + Dim AddTS As New atcDataGroup + Dim lTotalTS As New atcTimeseries(Nothing) + Dim lDownstreamReachID As Integer = lReach.DownOper("RCHRES") + Dim lUpstreamIn As Double = 0.0 + If lUpstreamInflows.Keys.Contains(lReach.Id) Then + lUpstreamIn = lUpstreamInflows.ItemByKey(lReach.Id) + End If + Dim lNPSLoad As Double = CalculateNPSLoad(aUCI, lReach, aBalanceType, aGQALID) + Dim lPSLoad As Double = CalculatePSLoad(aUCI, lReach, aSDateJ, aEDateJ, aBalanceType, aGQALID) + Dim lOutflow As Double = SubsetByDate(aBinaryData.DataSets.FindData("Location", LocationName).FindData("Constituent", aBalanceType & "-TROQAL")(0), + aSDateJ, aEDateJ, Nothing).Attributes.GetDefinedValue("SumAnnual").Value + Dim lTotalIn As Double = SubsetByDate(aBinaryData.DataSets.FindData("Location", LocationName).FindData("Constituent", aBalanceType & "-TIQAL")(0), + aSDateJ, aEDateJ, Nothing).Attributes.GetDefinedValue("SumAnnual").Value + Dim lDiversion As Double = CalculateDiversion(aUCI, aBinaryData, lReach, lUpstreamInflows, lDownstreamReachID, lOutflow, aBalanceType, aGQALID) + Dim lGENERLoad As Double = CalculateGENERLoad(aUCI, lReach, aBalanceType, aSDateJ, aEDateJ, aGQALID) + Dim lMassBalance As Double = lTotalIn - lNPSLoad - lUpstreamIn - lPSLoad - lGENERLoad + For Each columnValue As DataColumn In Reach_Budget_Table.Columns + Dim ColumnName As String = columnValue.ColumnName + Select Case ColumnName + Case "OpTypeNumber" + row(ColumnName) = LocationName + Case "OpDesc" + row(ColumnName) = lReach.Description + Case "NPSLoad" + row(ColumnName) = HspfTable.NumFmtRE(lNPSLoad, 10) + Case "PSLoad" + row(ColumnName) = HspfTable.NumFmtRE(lPSLoad, 10) + Case "GENERLoad" + row(ColumnName) = HspfTable.NumFmtRE(lGENERLoad, 10) + Case "Diversion" + row(ColumnName) = HspfTable.NumFmtRE(lDiversion, 10) + Case "MassBalance" + row(ColumnName) = HspfTable.NumFmtRE(lMassBalance, 10) + Case "UpstreamIn" + row(ColumnName) = HspfTable.NumFmtRE(lUpstreamIn, 10) + Case Else + Try + row(ColumnName) = HspfTable.NumFmtRE(SubsetByDate(aBinaryData.DataSets.FindData("Location", LocationName).FindData("Constituent", ColumnName)(0), + aSDateJ, aEDateJ, Nothing).Attributes.GetDefinedValue("SumAnnual").Value, 10) + Catch + 'row(ColumnName) + End Try + End Select + Next columnValue + + Reach_Budget_Table.Rows.Add(row) + Next lReach + Dim TextToWrite As String = "" + For Each TableColumn As DataColumn In Reach_Budget_Table.Columns 'Writing the table headings + TextToWrite &= TableColumn.Caption & vbTab + Next + lReport.AppendLine(TextToWrite) + For Each TableRow As DataRow In Reach_Budget_Table.Rows 'Writing the table contents + TextToWrite = "" + For Each TableColumn As DataColumn In Reach_Budget_Table.Columns + TextToWrite &= TableRow(TableColumn) & vbTab + Next TableColumn + lReport.AppendLine(TextToWrite) + Next TableRow + lReport.AppendLine() + lReport.AppendLine("Tabular Report of Average Annual Reach Budget for all the Reach Operations.") + lReport.AppendLine(" " & aUCI.GlobalBlock.RunInf.Value) + lReport.AppendLine(" Run Made " & aRunMade) + lReport.AppendLine(" " & TimeSpanAsString(aSDateJ, aEDateJ, "Analysis Period: ")) + SaveFileString(aoutfoldername & aBalanceType & "_Reach_Budget.txt", lReport.ToString) + Next lConstituent +#End Region + + End Select End Sub - Private Function CalculateNPSLoad(ByVal aUCI As HspfUci, ByVal aReach As HspfOperation, ByVal aConstituentName As String) As Double + Private Function CalculateNPSLoad(ByVal aUCI As HspfUci, ByVal aReach As HspfOperation, ByVal aConstituentName As String, Optional ByVal aGQALID As Integer = 0) As Double Dim NPSLoad As Double = 0.0 Dim SelectExpression As String = "" For Each lReachSource As HspfConnection In aReach.Sources @@ -1737,7 +1847,8 @@ Public Module atcConstituentTables End Function Private Function CalculatePSLoad(ByVal aUCI As HspfUci, ByVal aReach As HspfOperation, ByVal aSDateJ As Double, - ByVal aEDateJ As Double, ByVal aConstituentName As String) As Double + ByVal aEDateJ As Double, ByVal aConstituentName As String, + Optional ByVal aGQALID As Integer = 0) As Double Dim PSLoad As Double = 0.0 Select Case aConstituentName Case "DO" @@ -1914,11 +2025,40 @@ Public Module atcConstituentTables Next End If - Next lSource - End Select - - + Next lSource + Case Else + For Each lSource As HspfPointSource In aReach.PointSources + If (lSource.Target.Group = "INFLOW" AndAlso lSource.Target.Member = "IDQAL" AndAlso lSource.Target.MemSub1 = aGQALID) OrElse + (lSource.Target.Group = "INFLOW" AndAlso lSource.Target.Member = "ISQAL" AndAlso lSource.Target.MemSub2 = aGQALID) Then + Dim TimeSeriesTransformaton As String = lSource.Tran.ToString + Dim VolName As String = lSource.Source.VolName + Dim lDSN As Integer = lSource.Source.VolId + Dim lMfact As Double = lSource.MFact + Dim TransformationMultFact As Double = 0 + For i As Integer = 0 To aUCI.FilesBlock.Count + If aUCI.FilesBlock.Value(i).Typ = VolName Then + Dim lFileName As String = AbsolutePath(aUCI.FilesBlock.Value(i).Name.Trim, CurDir()) + Dim lDataSource As atcDataSource = atcDataManager.DataSourceBySpecification(lFileName) + If lDataSource Is Nothing Then + If atcDataManager.OpenDataSource(lFileName) Then + lDataSource = atcDataManager.DataSourceBySpecification(lFileName) + End If + End If + Dim ltimeseries As atcTimeseries = lDataSource.DataSets.FindData("ID", lDSN)(0) + ltimeseries = SubsetByDate(ltimeseries, aSDateJ, aEDateJ, Nothing) + TransformationMultFact = MultiFactorForPointSource(ltimeseries.Attributes.GetDefinedValue("Time Step").Value, ltimeseries.Attributes.GetDefinedValue("Time Unit").Value.ToString, + TimeSeriesTransformaton, aUCI.OpnSeqBlock.Delt) + PSLoad += ltimeseries.Attributes.GetDefinedValue("Sum").Value * lMfact * TransformationMultFact / YearCount(aSDateJ, aEDateJ) + End If + Next + End If + Next lSource + + End Select + + + Return PSLoad End Function @@ -1939,7 +2079,7 @@ Public Module atcConstituentTables Return MultiFactor End Function Private Function CalculateDiversion(ByVal aUCI As HspfUci, ByVal aBinaryDataSource As atcDataSource, ByVal aReach As HspfOperation, ByRef aUpstreamInflows As atcCollection, - ByVal aDownstreamReachID As Integer, ByVal aOutflow As Double, ByVal aConstituent As String) As Double + ByVal aDownstreamReachID As Integer, ByVal aOutflow As Double, ByVal aConstituent As String, Optional ByVal aGQALID As Integer = 0) As Double Dim lDiversion As Double = 0.0 Try If aReach.Tables("GEN-INFO").Parms("NEXITS").Value = 1 Then @@ -2000,6 +2140,8 @@ Public Module atcConstituentTables FindData("Constituent", lExitFlowConstituent)(0).Attributes.GetDefinedValue("SumAnnual").Value) lDiversion = aOutflow - lTotalOutFlow + Case Else + End Select aUpstreamInflows.Increment(aDownstreamReachID, lTotalOutFlow) End If @@ -2013,7 +2155,7 @@ Public Module atcConstituentTables Return lDiversion End Function Private Function CalculateGENERLoad(ByVal aUCI As HspfUci, ByVal aReach As HspfOperation, ByVal aConstituentName As String, - ByVal aSDateJ As Double, ByVal aEDateJ As Double) As Double + ByVal aSDateJ As Double, ByVal aEDateJ As Double, Optional ByVal aGQALID As Integer = 0) As Double Dim lGENERLoad As Double = 0.0 Select Case aConstituentName @@ -2240,8 +2382,40 @@ Public Module atcConstituentTables End If Next lSource - - + + Case Else + lGENERLoad = 0 + + For Each lSource As HspfConnection In aReach.Sources + Dim lGENERSum As Double = 0.0 + Dim lMfact As Double = 0.0 + If lSource.Source.VolName = "GENER" Then + Dim lGENEROperationisOutputtoWDM As Boolean = False + With GetGENERSum(aUCI, lSource, aSDateJ, aEDateJ) + lGENERSum = .Item1 + lGENEROperationisOutputtoWDM = .Item2 + End With + If lSource.MassLink > 0 Then + lGENERSum *= lSource.MFact + For Each lMassLink As HspfMassLink In aUCI.MassLinks + If (lMassLink.MassLinkId = lSource.MassLink AndAlso lMassLink.Target.Member = "IDQAL" AndAlso lMassLink.Target.MemSub1 = aGQALID) OrElse + (lMassLink.MassLinkId = lSource.MassLink AndAlso lMassLink.Target.Member = "ISQAL" AndAlso lMassLink.Target.MemSub2 = aGQALID) Then + lGENERSum *= lMassLink.MFact + lGENERLoad += lGENERSum + Exit For + End If + Next lMassLink + ElseIf (lSource.Target.Group = "INFLOW" AndAlso lSource.Target.Member = "IDQAL" AndAlso lSource.Target.MemSub1 = aGQALID) OrElse + (lSource.Target.Group = "INFLOW" AndAlso lSource.Target.Member = "ISQAL" AndAlso lSource.Target.MemSub2 = aGQALID) Then + lGENERSum *= lSource.MFact + lGENERLoad += lGENERSum + End If + If Not lGENEROperationisOutputtoWDM Then + Logger.Dbg("GENER Loadings Issue: The RCHRES operation " & aReach.Id & " has loadings input for the constituent " & aConstituentName & " from GENER connections in the Network Block. Please make sure that these GENER operations output to a WDM dataset for accurate source accounting.") + End If + End If + + Next lSource End Select Return lGENERLoad diff --git a/atcHspfSupport/modUtility.vb b/atcHspfSupport/modUtility.vb index bb8594e06..c79f48d70 100644 --- a/atcHspfSupport/modUtility.vb +++ b/atcHspfSupport/modUtility.vb @@ -1140,7 +1140,8 @@ Public Module Utility End Function Public Function FindMassLinkFactor(ByVal aUCI As HspfUci, ByVal aMassLink As Integer, ByVal aConstituent As String, - ByVal aBalanceType As String, ByVal aConversionFactor As Double, ByVal aMultipleIndex As Integer) As Double + ByVal aBalanceType As String, ByVal aConversionFactor As Double, ByVal aMultipleIndex As Integer, + Optional ByVal aGQALID As Integer = 0) As Double 'If aConstituent = "TAM" Then aConstituent = "NH3+NH4" Dim lMassLinkFactor As Double = 0.0 For Each lMassLink As HspfMassLink In aUCI.MassLinks @@ -1194,9 +1195,12 @@ Public Module Utility (lMassLink.Source.Member = "IOQUAL" OrElse lMassLink.Source.Member = "POQUAL") lMassLinkFactor = lMassLink.MFact Return lMassLinkFactor - Case (aConstituent = "WASHQS-NH3+NH4" OrElse aConstituent = "SCRQS-NH3+NH4") AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso - lMassLink.Target.MemSub1 = 2 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") - lMassLinkFactor = lMassLink.MFact + Case aConstituent = "WASHQS-NH3+NH4" AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 2 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "WASHQS" OrElse lMassLink.Source.Member = "SOQS") + lMassLinkFactor += lMassLink.MFact + Case aConstituent = "SCRQS-NH3+NH4" AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 2 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "SCRQS" OrElse lMassLink.Source.Member = "SOQS") + lMassLinkFactor += lMassLink.MFact Case (aConstituent = "SOQUAL-NO3" OrElse aConstituent = "SOQO-NO3") AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 1 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") lMassLinkFactor = lMassLink.MFact @@ -1294,13 +1298,14 @@ Public Module Utility Case aConstituent = "IOQUAL-PO4" AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 4 AndAlso (lMassLink.Source.Member = "IOQUAL" OrElse lMassLink.Source.Member = "POQUAL") lMassLinkFactor += lMassLink.MFact - Case (aConstituent = "WASHQS-PO4" OrElse aConstituent = "SCRQS-PO4") AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso - lMassLink.Target.MemSub2 = 2 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") + Case aConstituent = "WASHQS-PO4" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub2 = 2 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "WASHQS" OrElse lMassLink.Source.Member = "SOQS") + lMassLinkFactor += lMassLink.MFact + + Case aConstituent = "SCRQS-PO4" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub2 = 2 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "SCRQS" OrElse lMassLink.Source.Member = "SOQS") lMassLinkFactor += lMassLink.MFact - Case (aConstituent = "WASHQS-PO4" OrElse aConstituent = "SCRQS-PO4") AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso - lMassLink.Target.MemSub1 = 4 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") - lMassLinkFactor = lMassLink.MFact Case (aConstituent = "SOQUAL-ORTHO P" OrElse aConstituent = "SOQO-ORTHO P") AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 4 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") @@ -1314,11 +1319,13 @@ Public Module Utility (lMassLink.Source.Member = "IOQUAL" OrElse lMassLink.Source.Member = "POQUAL") lMassLinkFactor = lMassLink.MFact Return lMassLinkFactor - Case (aConstituent = "WASHQS-ORTHO P" OrElse aConstituent = "SCRQS-ORTHO P") AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso - lMassLink.Target.MemSub1 = 4 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") + + Case aConstituent = "WASHQS-ORTHO P" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub2 = 2 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "WASHQS" OrElse lMassLink.Source.Member = "SOQS") lMassLinkFactor += lMassLink.MFact - Case (aConstituent = "WASHQS-ORTHO P" OrElse aConstituent = "SCRQS-ORTHO P") AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso - lMassLink.Target.MemSub2 = 2 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") + + Case aConstituent = "SCRQS-ORTHO P" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub2 = 2 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "SCRQS" OrElse lMassLink.Source.Member = "SOQS") lMassLinkFactor += lMassLink.MFact Case (aConstituent = "WASHQS-BOD" OrElse aConstituent = "SCRQS-BOD" OrElse aConstituent = "SOQO-BOD" OrElse aConstituent = "SOQUAL-BOD" OrElse @@ -1499,11 +1506,11 @@ Public Module Utility Case "BOD-Labile" Select Case True - Case (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "WASHQS") AndAlso + Case (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "WASHQS" OrElse lMassLink.Source.Member = "SOQS") AndAlso aConstituent = "WASHQS-BOD-Labile" AndAlso lMassLink.Target.Member = "OXIF" AndAlso lMassLink.Target.MemSub1 = 2 lMassLinkFactor = lMassLink.MFact Return lMassLinkFactor - Case (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "SCRQS") AndAlso + Case (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "SCRQS" OrElse lMassLink.Source.Member = "SOQS") AndAlso aConstituent = "SCRQS-BOD-Labile" AndAlso lMassLink.Target.Member = "OXIF" AndAlso lMassLink.Target.MemSub1 = 2 lMassLinkFactor = lMassLink.MFact Return lMassLinkFactor @@ -1558,18 +1565,27 @@ Public Module Utility lMassLinkFactor = lMassLink.MFact End Select Case Else - Dim GQUALID As Integer = Right(aBalanceType, 1) + Select Case True 'Need to do it for sediment associated GQUAL - Case aConstituent.Contains("SOQO") AndAlso lMassLink.Target.Member = "IDQAL" AndAlso lMassLink.Target.MemSub1 = GQUALID AndAlso + Case aConstituent.Contains("SOQO") AndAlso lMassLink.Target.Member = "IDQAL" AndAlso lMassLink.Target.MemSub1 = aGQALID AndAlso (lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "SOQUAL") lMassLinkFactor = lMassLink.MFact - Case aConstituent.Contains("IOQUAL") AndAlso lMassLink.Target.Member = "IDQAL" AndAlso lMassLink.Target.MemSub1 = GQUALID AndAlso + Return lMassLinkFactor + Case aConstituent.Contains("IOQUAL") AndAlso lMassLink.Target.Member = "IDQAL" AndAlso lMassLink.Target.MemSub1 = aGQALID AndAlso (lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "IOQUAL") lMassLinkFactor = lMassLink.MFact - Case aConstituent.Contains("AOQUAL") AndAlso lMassLink.Target.Member = "IDQAL" AndAlso lMassLink.Target.MemSub1 = GQUALID AndAlso + Return lMassLinkFactor + Case aConstituent.Contains("AOQUAL") AndAlso lMassLink.Target.Member = "IDQAL" AndAlso lMassLink.Target.MemSub1 = aGQALID AndAlso (lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "AOQUAL") lMassLinkFactor = lMassLink.MFact + Return lMassLinkFactor + Case aConstituent.Contains("WASHQS") AndAlso lMassLink.Target.Member = "ISQAL" AndAlso lMassLink.Target.MemSub2 = aGQALID AndAlso + (lMassLink.Source.Member = "POQUAL" Or lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "WASHQS" OrElse lMassLink.Source.Member = "SOQS") + lMassLinkFactor += lMassLink.MFact + Case aConstituent.Contains("SCRQS") AndAlso lMassLink.Target.Member = "ISQAL" AndAlso lMassLink.Target.MemSub2 = aGQALID AndAlso + (lMassLink.Source.Member = "POQUAL" Or lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "SCRQS" OrElse lMassLink.Source.Member = "SOQS") + lMassLinkFactor += lMassLink.MFact End Select End Select @@ -1648,7 +1664,7 @@ Public Module Utility End Function - Public Function LocateConstituentNames(ByVal aUCI As HspfUci, ByVal aBalanceType As String) As List(Of ConstituentProperties) + Public Function LocateConstituentNames(ByVal aUCI As HspfUci, ByVal aBalanceType As String, Optional ByVal aGQALID As Integer = 0) As List(Of ConstituentProperties) Dim QUALs As New List(Of ConstituentProperties) Dim QUALNames As ConstituentProperties Dim QUALName As String = "" @@ -1934,29 +1950,30 @@ Public Module Utility QUALNames = New ConstituentProperties QUALNames.ConstNameForEXPPlus = aBalanceType QUALNames.ConstituentNameInUCI = aBalanceType - Dim GQALID As Integer = Right(aBalanceType, 1) lTableName = "QUAL-PROPS" - If GQALID > 1 Then lTableName = lTableName & ":" & GQALID + 'If aGQALID > 1 Then lTableName = lTableName & ":" & aGQALID Dim lTempQual As String = "" Dim lUnits As String = "" + If lOper.TableExists(lTableName) Then lTempQual = Trim(lOper.Tables(lTableName).Parms("QUALID").Value) - If SafeSubstring(aBalanceType, 0, aBalanceType.Length - 2) = lTempQual Then + If aBalanceType = lTempQual Then 'found it lUnits = Trim(lOper.Tables(lTableName).Parms("QTYID").Value) End If End If - 'Do While lUnits.Length = 0 - ' For lIndex As Integer = 2 To 10 - ' If lOper.TableExists(lTableName & ":" & lIndex.ToString) Then - ' lTempQual = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QUALID").Value) - ' If SafeSubstring(aBalanceType, 1, aBalanceType.Length - 2) = lTempQual Then - ' 'found it - ' lUnits = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QTYID").Value) - ' End If - ' End If - ' Next - 'Loop + Do While lUnits.Length = 0 + For lIndex As Integer = 2 To 10 + If lOper.TableExists(lTableName & ":" & lIndex.ToString) Then + lTempQual = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QUALID").Value) + If aBalanceType = lTempQual Then + 'found it + lUnits = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QTYID").Value) + Exit For + End If + End If + Next + Loop If aUCI.GlobalBlock.EmFg = 1 Then QUALNames.ConstituentUnit = lUnits & "/ac" @@ -2038,8 +2055,8 @@ Public Module Utility Case Else 'case for GQuals 'lOutflowDataType.Add("SOQUAL" & "-" & EXPPlusName, "SOQUAL" & "-" & QualityConstituent) - EXPPlusName = SafeSubstring(aBalanceType, 0, aBalanceType.Length - 2) - QualityConstituent = SafeSubstring(aBalanceType, 0, aBalanceType.Length - 2) + 'EXPPlusName = SafeSubstring(aBalanceType, 0, aBalanceType.Length - 2) + 'QualityConstituent = SafeSubstring(aBalanceType, 0, aBalanceType.Length - 2) lOutflowDataType.Add("WASHQS" & "-" & EXPPlusName, "WASHQS" & "-" & QualityConstituent) lOutflowDataType.Add("SCRQS" & "-" & EXPPlusName, "SCRQS" & "-" & QualityConstituent) lOutflowDataType.Add("SOQO" & "-" & EXPPlusName, "SOQO" & "-" & QualityConstituent) @@ -2089,7 +2106,7 @@ Public Module Utility If lOper IsNot Nothing Then Dim lTableName As String = "GQ-QALDATA" - If GQALID > 1 Then lTableName = lTableName & ":" & GQALID + 'If GQALID > 1 Then lTableName = lTableName & ":" & GQALID Dim lTempQual As String = "" If lOper.TableExists(lTableName) Then lTempQual = Trim(lOper.Tables(lTableName).Parms("GQID").Value) @@ -2098,17 +2115,17 @@ Public Module Utility lUnits = Trim(lOper.Tables(lTableName).Parms("QTYID").Value) End If End If - 'Do While lUnits.Length = 0 - ' For lIndex As Integer = 2 To 10 - ' If lOper.TableExists(lTableName & ":" & lIndex.ToString) Then - ' lTempQual = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("GQID").Value) - ' If aGQualName = lTempQual Then - ' 'found it - ' lUnits = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QTYID").Value) - ' End If - ' End If - ' Next - 'Loop + Do While lUnits.Length = 0 + For lIndex As Integer = 2 To 10 + If lOper.TableExists(lTableName & ":" & lIndex.ToString) Then + lTempQual = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("GQID").Value) + If aGQualName = lTempQual Then + 'found it + lUnits = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QTYID").Value) + End If + End If + Next + Loop End If Return lUnits diff --git a/atcTimeseriesWaterQualUS/obj/x86/Debug/atcTimeseriesWaterQualUS15.vbproj.FileListAbsolute.txt b/atcTimeseriesWaterQualUS/obj/x86/Debug/atcTimeseriesWaterQualUS15.vbproj.FileListAbsolute.txt new file mode 100644 index 000000000..c682ae7e8 --- /dev/null +++ b/atcTimeseriesWaterQualUS/obj/x86/Debug/atcTimeseriesWaterQualUS15.vbproj.FileListAbsolute.txt @@ -0,0 +1,10 @@ +C:\Dev\BASINS\BASINS\atcTimeseriesWaterQualUS\obj\x86\Debug\atcTimeseriesWaterQualUS15.vbprojResolveAssemblyReference.cache +C:\Dev\BASINS\BASINS\atcTimeseriesWaterQualUS\obj\x86\Debug\atcTimeseriesWaterQualUS.frmSelect.resources +C:\Dev\BASINS\BASINS\atcTimeseriesWaterQualUS\obj\x86\Debug\atcTimeseriesWaterQualUS.Resources.resources +C:\Dev\BASINS\BASINS\atcTimeseriesWaterQualUS\obj\x86\Debug\atcTimeseriesWaterQualUS15.vbproj.GenerateResource.Cache +C:\Dev\BASINS\BASINS\Bin\Plugins\BASINS\atcTimeseriesWaterQualUS.dll +C:\Dev\BASINS\BASINS\Bin\Plugins\BASINS\atcTimeseriesWaterQualUS.pdb +C:\Dev\BASINS\BASINS\Bin\Plugins\BASINS\atcTimeseriesWaterQualUS.xml +C:\Dev\BASINS\BASINS\atcTimeseriesWaterQualUS\obj\x86\Debug\atcTimeseriesWaterQualUS.dll +C:\Dev\BASINS\BASINS\atcTimeseriesWaterQualUS\obj\x86\Debug\atcTimeseriesWaterQualUS.xml +C:\Dev\BASINS\BASINS\atcTimeseriesWaterQualUS\obj\x86\Debug\atcTimeseriesWaterQualUS.pdb From ae88ca279f87885954cc19df786dab262c704f0b Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Tue, 6 Mar 2018 16:06:25 -0800 Subject: [PATCH 09/14] Updates for GQUAL Went through testing GQUAL for bacteria and metals in test uci files. I think the GQUAL reports are coming out are pretty good. now. Updated MASS-LINK factor calculation, Reach budget table etc. --- atcHspfSupport/atcConstituentTables.vb | 40 ++++++--- atcHspfSupport/modUtility.vb | 112 ++++++++++++++++++------- 2 files changed, 112 insertions(+), 40 deletions(-) diff --git a/atcHspfSupport/atcConstituentTables.vb b/atcHspfSupport/atcConstituentTables.vb index ecdebc6c2..c144b030a 100644 --- a/atcHspfSupport/atcConstituentTables.vb +++ b/atcHspfSupport/atcConstituentTables.vb @@ -663,7 +663,8 @@ Public Module atcConstituentTables lConstituentNames.Add(constituent.ConstNameForEXPPlus) End If - Dim lOutflowDataTypes1 As Dictionary(Of String, String) = ConstituentList(aBalanceType, constituent.ConstituentNameInUCI, constituent.ConstNameForEXPPlus) + Dim lOutflowDataTypes1 As Dictionary(Of String, String) = ConstituentList(aBalanceType, constituent.ConstituentNameInUCI, + constituent.ConstNameForEXPPlus, False, lOperation.Name) Dim lTSNumber As Integer = 0 Dim lTS As New atcTimeseries(Nothing) Dim AddTS As New atcDataGroup @@ -752,6 +753,7 @@ Public Module atcConstituentTables lYears.Add(Year) End If RowNumber += 1 + If lTSNumber = 0 Then row("OpTypeNumber") = LocationName row("OpDesc") = lOperation.Description @@ -760,9 +762,13 @@ Public Module atcConstituentTables row("ConstNameEXP") = constituent.ConstNameForEXPPlus row("Unit") = constituent.ConstituentUnit 'row("WASHQS") = lValue - row(lTSAttributes.Split("-")(0)) = lValue - Land_Constituent_Table.Rows.Add(row) - Else + If lTSAttributes.Split("-")(0) = "SOQS" Then 'For IMPLND, WASHQS is not a constituent, but Anurag wants to put this value in that column + row("WASHQS") = lValue + Else + row(lTSAttributes.Split("-")(0)) = lValue + End If + Land_Constituent_Table.Rows.Add(row) + Else Land_Constituent_Table.Rows(RowNumber - 1)(lTSAttributes.Split("-")(0)) = HspfTable.NumFmtRE(lValue, 10) End If Next i @@ -1703,8 +1709,10 @@ Public Module atcConstituentTables #Region "Else Case" Case Else + 'For GQAL Constituents For Each lConstituent As ConstituentProperties In aConstProperties - lUnits = lConstituent.ConstituentUnit + + lUnits = GQualUnits(aUCI, lConstituent.ConstituentNameInUCI) Dim column As DataColumn Dim row As DataRow @@ -1712,31 +1720,43 @@ Public Module atcConstituentTables column = New DataColumn() column.DataType = Type.GetType("System.Double") column.ColumnName = aBalanceType & "-TIQAL" - column.Caption = "Total GQAL Inflow (" & lUnits & ")" + column.Caption = "Total " & aBalanceType & " Inflow (" & lUnits & ")" Reach_Budget_Table.Columns.Add(column) column = New DataColumn() column.DataType = Type.GetType("System.Double") column.ColumnName = aBalanceType & "-PDQAL" - column.Caption = "Input of QAL due to decay of parents (" & lUnits & ")" + column.Caption = "Input of " & aBalanceType & " due to decay of parents (" & lUnits & ")" Reach_Budget_Table.Columns.Add(column) column = New DataColumn() column.DataType = Type.GetType("System.Double") column.ColumnName = aBalanceType & "-GQADEP" - column.Caption = "Total Atmospheric deposition of QAL (" & lUnits & ")" + column.Caption = "Total Atmospheric deposition of " & aBalanceType & " (" & lUnits & ")" Reach_Budget_Table.Columns.Add(column) column = New DataColumn() column.DataType = Type.GetType("System.Double") column.ColumnName = aBalanceType & "-DDQAL-TOT" - column.Caption = "Decay of Dissolved QAL (" & lUnits & ")" + column.Caption = "Decay of Dissolved " & aBalanceType & " (" & lUnits & ")" + Reach_Budget_Table.Columns.Add(column) + + column = New DataColumn() + column.DataType = Type.GetType("System.Double") + column.ColumnName = aBalanceType & "-DSQAL-TOT" + column.Caption = "Dep(+)/Scour(-) of " & aBalanceType & " (" & lUnits & ")" + Reach_Budget_Table.Columns.Add(column) + + column = New DataColumn() + column.DataType = Type.GetType("System.Double") + column.ColumnName = aBalanceType & "-ADQAL-TOT" + column.Caption = "Adsorption(+)/Desorption(-) of " & aBalanceType & "(" & lUnits & ")" Reach_Budget_Table.Columns.Add(column) column = New DataColumn() column.DataType = Type.GetType("System.Double") column.ColumnName = aBalanceType & "-TROQAL" - column.Caption = "Total Outflow of QAL (" & lUnits & ")" + column.Caption = "Total Outflow of " & aBalanceType & " (" & lUnits & ")" Reach_Budget_Table.Columns.Add(column) diff --git a/atcHspfSupport/modUtility.vb b/atcHspfSupport/modUtility.vb index c79f48d70..da5c54b08 100644 --- a/atcHspfSupport/modUtility.vb +++ b/atcHspfSupport/modUtility.vb @@ -1170,19 +1170,6 @@ Public Module Utility Case "TotalN" Select Case True - Case (aConstituent = "NO3+NO2-N - SURFACE LAYER OUTFLOW" OrElse aConstituent = "NO3+NO2-N - UPPER LAYER OUTFLOW" OrElse - aConstituent = "NO3+NO2-N - GROUNDWATER OUTFLOW" OrElse aConstituent = "NO3-N - TOTAL OUTFLOW") AndAlso - lMassLink.Target.Member.ToString = "NUIF1" And lMassLink.Target.MemSub1 = 1 - lMassLinkFactor = lMassLink.MFact - Return lMassLinkFactor - - Case (aConstituent = "NH4-N IN SOLUTION - SURFACE LAYER OUTFLOW" OrElse aConstituent = "NH4-N IN SOLUTION - UPPER LAYER OUTFLOW" OrElse - aConstituent = "NH4-N IN SOLUTION - GROUNDWATER OUTFLOW") AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 2 - lMassLinkFactor = lMassLink.MFact - Return lMassLinkFactor - Case aConstituent = "NH4-N ADS - SEDIMENT ASSOC OUTFLOW" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso - lMassLink.Target.MemSub2 = 1 'lMassLink.Target.MemSub1 = 1 AndAlso - lMassLinkFactor += lMassLink.MFact Case (aConstituent = "SOQUAL-NH3+NH4" OrElse aConstituent = "SOQO-NH3+NH4") AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 2 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") lMassLinkFactor = lMassLink.MFact @@ -1195,12 +1182,27 @@ Public Module Utility (lMassLink.Source.Member = "IOQUAL" OrElse lMassLink.Source.Member = "POQUAL") lMassLinkFactor = lMassLink.MFact Return lMassLinkFactor + + 'When sediment associated NH3+NH4 enters into stream as dissolved Case aConstituent = "WASHQS-NH3+NH4" AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 2 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") + lMassLinkFactor = lMassLink.MFact + Case aConstituent = "SCRQS-NH3+NH4" AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 2 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") + lMassLinkFactor = lMassLink.MFact + Case aConstituent = "SOQS-NH3+NH4" AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 2 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "SOQS") + lMassLinkFactor = lMassLink.MFact + + 'When sediment associated NH3+NH4 enters into stream as associated with sediment + Case aConstituent = "WASHQS-NH3+NH4" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub2 = 1 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "WASHQS" OrElse lMassLink.Source.Member = "SOQS") lMassLinkFactor += lMassLink.MFact - Case aConstituent = "SCRQS-NH3+NH4" AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 2 AndAlso - (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "SCRQS" OrElse lMassLink.Source.Member = "SOQS") + Case aConstituent = "SCRQS-NH3+NH4" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub2 = 1 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "SCRQS" OrElse lMassLink.Source.Member = "SOQS") lMassLinkFactor += lMassLink.MFact + + Case (aConstituent = "SOQUAL-NO3" OrElse aConstituent = "SOQO-NO3") AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 1 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") lMassLinkFactor = lMassLink.MFact @@ -1213,6 +1215,7 @@ Public Module Utility (lMassLink.Source.Member = "IOQUAL" OrElse lMassLink.Source.Member = "POQUAL") lMassLinkFactor = lMassLink.MFact Return lMassLinkFactor + Case (aConstituent = "WASHQS-BOD" OrElse aConstituent = "SCRQS-BOD" OrElse aConstituent = "SOQO-BOD" OrElse aConstituent = "SOQUAL-BOD" OrElse aConstituent = "WASHQS-Ref-OrgN" OrElse aConstituent = "SCRQS-Ref-OrgN" OrElse aConstituent = "SOQO-Ref-OrgN" OrElse aConstituent = "SOQUAL-Ref-OrgN" OrElse aConstituent = "WASHQS-lab-OrgN" OrElse aConstituent = "SCRQS-lab-OrgN" OrElse aConstituent = "SOQO-lab-OrgN" OrElse aConstituent = "SOQUAL-lab-OrgN") AndAlso @@ -1248,6 +1251,20 @@ Public Module Utility lMassLinkFactor = lMassLink.MFact + BODMFact(aUCI, "AOQUAL-BOD", lMassLink.MassLinkId) * aConversionFactor End If Return lMassLinkFactor + + 'Following are AGCHEM cases + Case (aConstituent = "NO3+NO2-N - SURFACE LAYER OUTFLOW" OrElse aConstituent = "NO3+NO2-N - UPPER LAYER OUTFLOW" OrElse + aConstituent = "NO3+NO2-N - GROUNDWATER OUTFLOW" OrElse aConstituent = "NO3-N - TOTAL OUTFLOW") AndAlso + lMassLink.Target.Member.ToString = "NUIF1" And lMassLink.Target.MemSub1 = 1 + lMassLinkFactor = lMassLink.MFact + Return lMassLinkFactor + Case (aConstituent = "NH4-N IN SOLUTION - SURFACE LAYER OUTFLOW" OrElse aConstituent = "NH4-N IN SOLUTION - UPPER LAYER OUTFLOW" OrElse + aConstituent = "NH4-N IN SOLUTION - GROUNDWATER OUTFLOW") AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 2 + lMassLinkFactor = lMassLink.MFact + Return lMassLinkFactor + Case aConstituent = "NH4-N ADS - SEDIMENT ASSOC OUTFLOW" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso + lMassLink.Target.MemSub2 = 1 'lMassLink.Target.MemSub1 = 1 AndAlso + lMassLinkFactor += lMassLink.MFact Case aConstituent = "ORGN - TOTAL OUTFLOW" AndAlso lMassLink.Target.Member.ToString = "PKIF" AndAlso lMassLink.Target.MemSub1 = 3 If aMultipleIndex = 2 Then lMassLinkFactor = lMassLink.MFact @@ -1269,6 +1286,7 @@ Public Module Utility lMassLinkFactor = 1 Return lMassLinkFactor + End Select ' 'Anurag does not remember what specific cases do three following lines address. @@ -1298,6 +1316,15 @@ Public Module Utility Case aConstituent = "IOQUAL-PO4" AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 4 AndAlso (lMassLink.Source.Member = "IOQUAL" OrElse lMassLink.Source.Member = "POQUAL") lMassLinkFactor += lMassLink.MFact + + 'If sediment associated PO4 enters into stream as dissolved PO4 + Case (aConstituent = "WASHQS-PO4" OrElse aConstituent = "SCRQS-PO4" OrElse aConstituent = "SOQS-PO4") AndAlso + lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub2 = 4 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") + lMassLinkFactor = lMassLink.MFact + Return lMassLinkFactor + + 'If sediment associated PO4 enters into stream as sediment associated Case aConstituent = "WASHQS-PO4" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub2 = 2 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "WASHQS" OrElse lMassLink.Source.Member = "SOQS") lMassLinkFactor += lMassLink.MFact @@ -1306,6 +1333,9 @@ Public Module Utility (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "SCRQS" OrElse lMassLink.Source.Member = "SOQS") lMassLinkFactor += lMassLink.MFact + Case aConstituent = "SOQS-PO4" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub2 = 2 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "SOQS") + lMassLinkFactor += lMassLink.MFact Case (aConstituent = "SOQUAL-ORTHO P" OrElse aConstituent = "SOQO-ORTHO P") AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 4 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") @@ -1320,6 +1350,13 @@ Public Module Utility lMassLinkFactor = lMassLink.MFact Return lMassLinkFactor + 'If sediment associated PO4 enters into stream as dissolved PO4 + Case (aConstituent = "WASHQS-ORTHO P" OrElse aConstituent = "SCRQS-ORTHO P" OrElse aConstituent = "SOQS-ORTHO P") AndAlso + lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub2 = 4 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") + lMassLinkFactor = lMassLink.MFact + Return lMassLinkFactor + 'If sediment associated PO4 enters into stream as sediment associated Case aConstituent = "WASHQS-ORTHO P" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub2 = 2 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "WASHQS" OrElse lMassLink.Source.Member = "SOQS") lMassLinkFactor += lMassLink.MFact @@ -1328,6 +1365,10 @@ Public Module Utility (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL" OrElse lMassLink.Source.Member = "SCRQS" OrElse lMassLink.Source.Member = "SOQS") lMassLinkFactor += lMassLink.MFact + Case aConstituent = "SOQS-ORTHO P" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub2 = 2 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "SOQS") + lMassLinkFactor += lMassLink.MFact + Case (aConstituent = "WASHQS-BOD" OrElse aConstituent = "SCRQS-BOD" OrElse aConstituent = "SOQO-BOD" OrElse aConstituent = "SOQUAL-BOD" OrElse aConstituent = "WASHQS-Ref-OrgP" OrElse aConstituent = "SCRQS-Ref-OrgP" OrElse aConstituent = "SOQO-Ref-OrgP" OrElse aConstituent = "SOQUAL-Ref-OrgP" OrElse aConstituent = "WASHQS-lab-OrgP" OrElse aConstituent = "SCRQS-lab-OrgP" OrElse aConstituent = "SOQO-lab-OrgP" OrElse aConstituent = "SOQUAL-lab-OrgP") AndAlso @@ -1586,6 +1627,9 @@ Public Module Utility Case aConstituent.Contains("SCRQS") AndAlso lMassLink.Target.Member = "ISQAL" AndAlso lMassLink.Target.MemSub2 = aGQALID AndAlso (lMassLink.Source.Member = "POQUAL" Or lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "SCRQS" OrElse lMassLink.Source.Member = "SOQS") lMassLinkFactor += lMassLink.MFact + Case aConstituent.Contains("SOQS") AndAlso lMassLink.Target.Member = "ISQAL" AndAlso lMassLink.Target.MemSub2 = aGQALID AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "SOQS") + lMassLinkFactor += lMassLink.MFact End Select End Select @@ -2005,7 +2049,8 @@ Public Module Utility End Function Public Function ConstituentList(ByVal aBalanceType As String, Optional ByVal QualityConstituent As String = "", - Optional ByVal EXPPlusName As String = "", Optional ByVal AgChemConst As Boolean = False) As Dictionary(Of String, String) + Optional ByVal EXPPlusName As String = "", Optional ByVal AgChemConst As Boolean = False, + Optional ByVal aOperName As String = "") As Dictionary(Of String, String) 'Design for AGCHEM Case as well. Dim lOutflowDataType As New Dictionary(Of String, String) Select Case aBalanceType @@ -2046,22 +2091,29 @@ Public Module Utility Case "TotalN", "TotalP" If EXPPlusName = "TAM" Then EXPPlusName = "NH3+NH4" - lOutflowDataType.Add("WASHQS" & "-" & EXPPlusName, "WASHQS" & "-" & QualityConstituent) - lOutflowDataType.Add("SCRQS" & "-" & EXPPlusName, "SCRQS" & "-" & QualityConstituent) - lOutflowDataType.Add("SOQO" & "-" & EXPPlusName, "SOQO" & "-" & QualityConstituent) - lOutflowDataType.Add("IOQUAL" & "-" & EXPPlusName, "IOQUAL" & "-" & QualityConstituent) - lOutflowDataType.Add("AOQUAL" & "-" & EXPPlusName, "AOQUAL" & "-" & QualityConstituent) + If aOperName = "PERLND" Then + lOutflowDataType.Add("WASHQS" & "-" & EXPPlusName, "WASHQS" & "-" & QualityConstituent) + lOutflowDataType.Add("SCRQS" & "-" & EXPPlusName, "SCRQS" & "-" & QualityConstituent) + lOutflowDataType.Add("SOQO" & "-" & EXPPlusName, "SOQO" & "-" & QualityConstituent) + lOutflowDataType.Add("IOQUAL" & "-" & EXPPlusName, "IOQUAL" & "-" & QualityConstituent) + lOutflowDataType.Add("AOQUAL" & "-" & EXPPlusName, "AOQUAL" & "-" & QualityConstituent) + ElseIf aOperName = "IMPLND" Then + lOutflowDataType.Add("SOQS" & "-" & EXPPlusName, "SOQS" & "-" & QualityConstituent) + lOutflowDataType.Add("SOQO" & "-" & EXPPlusName, "SOQO" & "-" & QualityConstituent) + End If lOutflowDataType.Add("TotalOutflow" & "-" & EXPPlusName, "TotalOutflow" & "-" & QualityConstituent) Case Else 'case for GQuals - 'lOutflowDataType.Add("SOQUAL" & "-" & EXPPlusName, "SOQUAL" & "-" & QualityConstituent) - 'EXPPlusName = SafeSubstring(aBalanceType, 0, aBalanceType.Length - 2) - 'QualityConstituent = SafeSubstring(aBalanceType, 0, aBalanceType.Length - 2) - lOutflowDataType.Add("WASHQS" & "-" & EXPPlusName, "WASHQS" & "-" & QualityConstituent) - lOutflowDataType.Add("SCRQS" & "-" & EXPPlusName, "SCRQS" & "-" & QualityConstituent) - lOutflowDataType.Add("SOQO" & "-" & EXPPlusName, "SOQO" & "-" & QualityConstituent) - lOutflowDataType.Add("IOQUAL" & "-" & EXPPlusName, "IOQUAL" & "-" & QualityConstituent) - lOutflowDataType.Add("AOQUAL" & "-" & EXPPlusName, "AOQUAL" & "-" & QualityConstituent) + If aOperName = "PERLND" Then + lOutflowDataType.Add("WASHQS" & "-" & EXPPlusName, "WASHQS" & "-" & QualityConstituent) + lOutflowDataType.Add("SCRQS" & "-" & EXPPlusName, "SCRQS" & "-" & QualityConstituent) + lOutflowDataType.Add("SOQO" & "-" & EXPPlusName, "SOQO" & "-" & QualityConstituent) + lOutflowDataType.Add("IOQUAL" & "-" & EXPPlusName, "IOQUAL" & "-" & QualityConstituent) + lOutflowDataType.Add("AOQUAL" & "-" & EXPPlusName, "AOQUAL" & "-" & QualityConstituent) + ElseIf aOperName = "IMPLND" Then + lOutflowDataType.Add("SOQS" & "-" & EXPPlusName, "SOQS" & "-" & QualityConstituent) + lOutflowDataType.Add("SOQO" & "-" & EXPPlusName, "SOQO" & "-" & QualityConstituent) + End If lOutflowDataType.Add("TotalOutflow" & "-" & EXPPlusName, "TotalOutflow" & "-" & QualityConstituent) End Select @@ -2094,7 +2146,7 @@ Public Module Utility Public Function GQualUnits(ByVal aUCI As HspfUci, ByVal aGQualName As String) As String 'given a uci and gqualname, return the units of the gqual Dim lUnits As String = "" - Dim GQALID As Integer = Right(aGQualName, 1) + 'Dim GQALID As Integer = Right(aGQualName, 1) Dim lOper As New HspfOperation For Each Oper As HspfOperation In aUCI.OpnBlks("RCHRES").Ids If Oper.Tables("ACTIVITY").Parms("GQALFG").Value = "1" Then From 333cd7fee9dd3f1dd82fc0ea6a42f3beb302c721 Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Mon, 12 Mar 2018 14:11:43 -0700 Subject: [PATCH 10/14] Multiple Updates for EXP+ Reports 1. Updated Reach Budget reports with GQUAL 2. Code to look for GQUAL units has been fixed. 3. Added some more MASS-LINK conditions. 4. Updated insallation text. 5. Changed version number to 2.0.0 6. Updated steup scripts with version nnumber. --- HSPEXP/HSPEXP+-D4EM10_common.vbproj | 2 +- HSPEXP/My Project/AssemblyInfo.vb | 4 +- HSPEXP/SetUpScript.iss | 4 +- HSPEXP/install.txt | 17 +++++ atcHspfSupport/atcConstituentTables.vb | 92 +++++++++++++++++++------- atcHspfSupport/modUtility.vb | 48 ++++++++++---- 6 files changed, 124 insertions(+), 43 deletions(-) diff --git a/HSPEXP/HSPEXP+-D4EM10_common.vbproj b/HSPEXP/HSPEXP+-D4EM10_common.vbproj index 26ed89d92..1360a86e7 100644 --- a/HSPEXP/HSPEXP+-D4EM10_common.vbproj +++ b/HSPEXP/HSPEXP+-D4EM10_common.vbproj @@ -47,7 +47,7 @@ index.htm false 0 - 1.30.0.0 + 2.0.0.0 false true true diff --git a/HSPEXP/My Project/AssemblyInfo.vb b/HSPEXP/My Project/AssemblyInfo.vb index 674c8248b..08f71d9a5 100644 --- a/HSPEXP/My Project/AssemblyInfo.vb +++ b/HSPEXP/My Project/AssemblyInfo.vb @@ -32,6 +32,6 @@ Imports System.Runtime.InteropServices ' by using the '*' as shown below: ' - - + + diff --git a/HSPEXP/SetUpScript.iss b/HSPEXP/SetUpScript.iss index b3e6b8a47..df1fb301e 100644 --- a/HSPEXP/SetUpScript.iss +++ b/HSPEXP/SetUpScript.iss @@ -2,7 +2,7 @@ ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "HSPEXP+" -#define MyAppVersion "1.40beta7" +#define MyAppVersion "2.00beta" #define MyAppPublisher "RESPEC" #define MyAppURL "http://www.respec.com/product/hspexp/" #define MyAppExeName "HSPEXP+.exe" @@ -21,7 +21,7 @@ AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={reg:HKLM\SOFTWARE\RESPEC\BASINS41,Base Directory|{pf}\HSPEXP+} DefaultGroupName={#MyAppName} -OutputBaseFilename=HSPEXP+1.40beta7SetUp +OutputBaseFilename=HSPEXP+2.00betaSetUp Compression=lzma SolidCompression=yes InfoBeforeFile=install.txt diff --git a/HSPEXP/install.txt b/HSPEXP/install.txt index d62918b48..549d1dd98 100644 --- a/HSPEXP/install.txt +++ b/HSPEXP/install.txt @@ -1,3 +1,20 @@ +HSPEXP+2.0.0beta +Date: 03/08/2018 +Features: +1. Multi Simulation Manager is available that can be used for sensitivity analysis, uncertainty analysis, and scenario analysis. +2. Reports for additional constituents including Heat, DO, BOD-Labile are also generated. +3. Reach Budget reports for N and P constituents are also generated. +4. Some reports are now generated so that they can be easily filtered in spreadhseet program as needed. +5. Monthly land loading reports are also generated. +6. Box-whisker plots of constituent loading by land use and box-whisker plots of monthly constituent loadings are also produced. +7. In the Regan plots, daily maximum and daily minimimum DO concentrations are plotted if hourly DO data is available in the binary files. +8. If GQUAL is simulated, then land loading and reach budget reports for all the GQUAL constituents are available. + +Bugs Fixed: +1. Multiple small bugs fixed. In general, the warning messages do not stop HSPEXP+ calculations. The warning messages are added in the log file. +2. HSPEXP+ calculations were made more efficient. + + HSPEXP+1.40beta7 Dated: 02/08/2018 Features: diff --git a/atcHspfSupport/atcConstituentTables.vb b/atcHspfSupport/atcConstituentTables.vb index c144b030a..e341f858a 100644 --- a/atcHspfSupport/atcConstituentTables.vb +++ b/atcHspfSupport/atcConstituentTables.vb @@ -700,12 +700,13 @@ Public Module atcConstituentTables lTS = aBinaryData.DataSets.FindData("Location", LocationName).FindData("Constituent", lOutflowDataTypes1(lOutflowDataType))(0) If lTS Is Nothing Then Continue For + If lTS.Attributes.GetDefinedValue("Sum").Value = 0 Then Continue For lTS = SubsetByDate(lTS, aSDateJ, aEDateJ, Nothing) For Each lConnection As HspfConnection In lOperation.Targets If lConnection.Target.VolName = "RCHRES" Then Dim aReach As HspfOperation = aUCI.OpnBlks("RCHRES").OperFromID(lConnection.Target.VolId) Dim aConversionFactor As Double = 0.0 - If aBalanceType = "TotalN" Or aBalanceType = "TotalP" Then + If aBalanceType = "TN" Or aBalanceType = "TP" Then aConversionFactor = ConversionFactorfromOxygen(aUCI, constituent.ReportType, aReach) End If Dim lMassLinkID As Integer = lConnection.MassLink @@ -1005,6 +1006,8 @@ Public Module atcConstituentTables Dim lUnits As String = "" Select Case aBalanceType + Case "Water", "Sediment" + 'not generating reach budget report for water and sediment #Region "DO Case" Case "DO" @@ -1451,7 +1454,7 @@ Public Module atcConstituentTables SaveFileString(aoutfoldername & aBalanceType & "_Reach_Budget.txt", lReport.ToString) #End Region #Region "TotalN Case" - Case "TotalN" + Case "TN" For Each lConstituent As ConstituentProperties In aConstProperties Reach_Budget_Table = New DataTable Dim lReachConstituent As String = lConstituent.ConstNameForEXPPlus @@ -1590,7 +1593,7 @@ Public Module atcConstituentTables #End Region #Region "TotalP Case" - Case "TotalP" + Case "TP" For Each lConstituent As ConstituentProperties In aConstProperties Reach_Budget_Table = New DataTable Dim lReachConstituent As String = lConstituent.ConstNameForEXPPlus @@ -1765,7 +1768,7 @@ Public Module atcConstituentTables If Not lReach.Name = "RCHRES" Then Continue For If Not lReach.Tables("ACTIVITY").Parms("HTFG").Value = "1" Then Continue For Dim LocationName As String = lReach.Name.Substring(0, 1) & ":" & lReach.Id - 'Dim lOutflowDataTypes1 As String() = ConstituentListRCHRES(aBalanceType) + 'If lReach.Id = 106 Then Stop Dim lTS As New atcTimeseries(Nothing) Dim AddTS As New atcDataGroup Dim lTotalTS As New atcTimeseries(Nothing) @@ -2101,6 +2104,7 @@ Public Module atcConstituentTables Private Function CalculateDiversion(ByVal aUCI As HspfUci, ByVal aBinaryDataSource As atcDataSource, ByVal aReach As HspfOperation, ByRef aUpstreamInflows As atcCollection, ByVal aDownstreamReachID As Integer, ByVal aOutflow As Double, ByVal aConstituent As String, Optional ByVal aGQALID As Integer = 0) As Double Dim lDiversion As Double = 0.0 + Dim lTimeSeries As New atcTimeseries(Nothing) Try If aReach.Tables("GEN-INFO").Parms("NEXITS").Value = 1 Then 'Logger.Dbg(aReach.Id) @@ -2113,54 +2117,92 @@ Public Module atcConstituentTables Select Case aConstituent Case "DO" lExitFlowConstituent = "DOXOUT-EXIT" & lExitNUmber - lTotalOutFlow = (aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). - FindData("Constituent", lExitFlowConstituent)(0).Attributes.GetDefinedValue("SumAnnual").Value) + lTimeSeries = aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). + FindData("Constituent", lExitFlowConstituent)(0) + If Not lTimeSeries Is Nothing Then + lTotalOutFlow = lTimeSeries.Attributes.GetDefinedValue("SumAnnual").Value + End If lDiversion = aOutflow - lTotalOutFlow - Case "BOD-Labile" lExitFlowConstituent = "BODOUT-EXIT" & lExitNUmber - lTotalOutFlow = (aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). - FindData("Constituent", lExitFlowConstituent)(0).Attributes.GetDefinedValue("SumAnnual").Value) + lTimeSeries = aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). + FindData("Constituent", lExitFlowConstituent)(0) + If Not lTimeSeries Is Nothing Then + lTotalOutFlow = lTimeSeries.Attributes.GetDefinedValue("SumAnnual").Value + End If lDiversion = aOutflow - lTotalOutFlow - Case "Heat" lExitFlowConstituent = "OHEAT - EXIT-" & lExitNUmber - lTotalOutFlow = (aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). - FindData("Constituent", lExitFlowConstituent)(0).Attributes.GetDefinedValue("SumAnnual").Value) + lTimeSeries = aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). + FindData("Constituent", lExitFlowConstituent)(0) + If Not lTimeSeries Is Nothing Then + lTotalOutFlow = lTimeSeries.Attributes.GetDefinedValue("SumAnnual").Value + End If lDiversion = aOutflow - lTotalOutFlow - Case "NO3" lExitFlowConstituent = "NO3-OUTDIS-EXIT" & lExitNUmber - lTotalOutFlow = (aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). - FindData("Constituent", lExitFlowConstituent)(0).Attributes.GetDefinedValue("SumAnnual").Value) + lTimeSeries = aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). + FindData("Constituent", lExitFlowConstituent)(0) + If Not lTimeSeries Is Nothing Then + lTotalOutFlow = lTimeSeries.Attributes.GetDefinedValue("SumAnnual").Value + End If lExitFlowConstituent = "NO2-OUTDIS-EXIT" & lExitNUmber - lTotalOutFlow += (aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). - FindData("Constituent", lExitFlowConstituent)(0).Attributes.GetDefinedValue("SumAnnual").Value) + lTimeSeries = aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). + FindData("Constituent", lExitFlowConstituent)(0) + If Not lTimeSeries Is Nothing Then + lTotalOutFlow += lTimeSeries.Attributes.GetDefinedValue("SumAnnual").Value + End If lDiversion = aOutflow - lTotalOutFlow Case "TAM" lExitFlowConstituent = "TAM-OUTDIS-EXIT" & lExitNUmber - lTotalOutFlow = (aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). - FindData("Constituent", lExitFlowConstituent)(0).Attributes.GetDefinedValue("SumAnnual").Value) + lTimeSeries = aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). + FindData("Constituent", lExitFlowConstituent)(0) + If Not lTimeSeries Is Nothing Then + lTotalOutFlow = lTimeSeries.Attributes.GetDefinedValue("SumAnnual").Value + End If lExitFlowConstituent = "TAM-OUTPART-TOT-EXIT" & lExitNUmber - lTotalOutFlow += (aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). - FindData("Constituent", lExitFlowConstituent)(0).Attributes.GetDefinedValue("SumAnnual").Value) + lTimeSeries = aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). + FindData("Constituent", lExitFlowConstituent)(0) + If Not lTimeSeries Is Nothing Then + lTotalOutFlow += lTimeSeries.Attributes.GetDefinedValue("SumAnnual").Value + End If lDiversion = aOutflow - lTotalOutFlow Case "PO4" lExitFlowConstituent = "PO4-OUTDIS-EXIT" & lExitNUmber - lTotalOutFlow = (aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). - FindData("Constituent", lExitFlowConstituent)(0).Attributes.GetDefinedValue("SumAnnual").Value) + lTimeSeries = aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). + FindData("Constituent", lExitFlowConstituent)(0) + If Not lTimeSeries Is Nothing Then + lTotalOutFlow = lTimeSeries.Attributes.GetDefinedValue("SumAnnual").Value + End If lExitFlowConstituent = "PO4-OUTPART-TOT-EXIT" & lExitNUmber - lTotalOutFlow += (aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). - FindData("Constituent", lExitFlowConstituent)(0).Attributes.GetDefinedValue("SumAnnual").Value) + lTimeSeries = aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). + FindData("Constituent", lExitFlowConstituent)(0) + If Not lTimeSeries Is Nothing Then + lTotalOutFlow += lTimeSeries.Attributes.GetDefinedValue("SumAnnual").Value + End If lDiversion = aOutflow - lTotalOutFlow Case Else + lExitFlowConstituent = aConstituent & "-TOSQAL-EXIT" & lExitNUmber + + lTimeSeries = aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). + FindData("Constituent", lExitFlowConstituent)(0) + If Not lTimeSeries Is Nothing Then + lTotalOutFlow = lTimeSeries.Attributes.GetDefinedValue("SumAnnual").Value + End If + lExitFlowConstituent = aConstituent & "-ODQAL-EXIT" & lExitNUmber + lTimeSeries = aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). + FindData("Constituent", lExitFlowConstituent)(0) + If Not lTimeSeries Is Nothing Then + lTotalOutFlow += lTimeSeries.Attributes.GetDefinedValue("SumAnnual").Value + End If + lDiversion = aOutflow - lTotalOutFlow End Select aUpstreamInflows.Increment(aDownstreamReachID, lTotalOutFlow) diff --git a/atcHspfSupport/modUtility.vb b/atcHspfSupport/modUtility.vb index da5c54b08..c7b811b6b 100644 --- a/atcHspfSupport/modUtility.vb +++ b/atcHspfSupport/modUtility.vb @@ -1183,6 +1183,13 @@ Public Module Utility lMassLinkFactor = lMassLink.MFact Return lMassLinkFactor + 'When dissolved Nh3+NH4 enters into strean as sediment attached. + + Case aConstituent = "SOQO-NH3+NH4" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub1 = 1 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") + lMassLinkFactor += lMassLink.MFact + + 'When sediment associated NH3+NH4 enters into stream as dissolved Case aConstituent = "WASHQS-NH3+NH4" AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 2 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") @@ -1307,7 +1314,7 @@ Public Module Utility Select Case True Case (aConstituent = "SOQUAL-PO4" OrElse aConstituent = "SOQO-PO4") AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 4 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") - lMassLinkFactor = lMassLink.MFact + lMassLinkFactor += lMassLink.MFact Return lMassLinkFactor Case aConstituent = "AOQUAL-PO4" AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 4 AndAlso (lMassLink.Source.Member = "AOQUAL" OrElse lMassLink.Source.Member = "POQUAL") @@ -1317,12 +1324,18 @@ Public Module Utility (lMassLink.Source.Member = "IOQUAL" OrElse lMassLink.Source.Member = "POQUAL") lMassLinkFactor += lMassLink.MFact + 'if dissolved PO4 enters into stream as sediment attached PO4 + Case aConstituent = "SOQO-PO4" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub2 = 2 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") + lMassLinkFactor += lMassLink.MFact + + 'If sediment associated PO4 enters into stream as dissolved PO4 Case (aConstituent = "WASHQS-PO4" OrElse aConstituent = "SCRQS-PO4" OrElse aConstituent = "SOQS-PO4") AndAlso - lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub2 = 4 AndAlso + lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 4 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") - lMassLinkFactor = lMassLink.MFact - Return lMassLinkFactor + lMassLinkFactor += lMassLink.MFact + 'Return lMassLinkFactor 'If sediment associated PO4 enters into stream as sediment associated Case aConstituent = "WASHQS-PO4" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub2 = 2 AndAlso @@ -1334,7 +1347,7 @@ Public Module Utility lMassLinkFactor += lMassLink.MFact Case aConstituent = "SOQS-PO4" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub2 = 2 AndAlso - (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "SOQS") + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "SOQS") lMassLinkFactor += lMassLink.MFact Case (aConstituent = "SOQUAL-ORTHO P" OrElse aConstituent = "SOQO-ORTHO P") AndAlso lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 4 AndAlso @@ -1350,9 +1363,15 @@ Public Module Utility lMassLinkFactor = lMassLink.MFact Return lMassLinkFactor - 'If sediment associated PO4 enters into stream as dissolved PO4 + 'if dissolved PO4 enters into stream as sediment attached PO4 + Case aConstituent = "SOQO-ORTHO P" AndAlso lMassLink.Target.Member.ToString = "NUIF2" AndAlso lMassLink.Target.MemSub2 = 2 AndAlso + (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") + lMassLinkFactor += lMassLink.MFact + + + 'If sediment associated PO4 enters into stream as dissolved PO4 Case (aConstituent = "WASHQS-ORTHO P" OrElse aConstituent = "SCRQS-ORTHO P" OrElse aConstituent = "SOQS-ORTHO P") AndAlso - lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub2 = 4 AndAlso + lMassLink.Target.Member.ToString = "NUIF1" AndAlso lMassLink.Target.MemSub1 = 4 AndAlso (lMassLink.Source.Member = "SOQUAL" OrElse lMassLink.Source.Member = "POQUAL") lMassLinkFactor = lMassLink.MFact Return lMassLinkFactor @@ -1989,6 +2008,8 @@ Public Module Utility QUALNames.ReportType = aBalanceType QUALs.Add(QUALNames) Return QUALs + Case "BOD-Labile" + Return QUALs Case Else QUALNames = New ConstituentProperties @@ -2167,17 +2188,18 @@ Public Module Utility lUnits = Trim(lOper.Tables(lTableName).Parms("QTYID").Value) End If End If - Do While lUnits.Length = 0 - For lIndex As Integer = 2 To 10 + 'Do While lUnits.Length = 0 + For lIndex As Integer = 2 To 10 If lOper.TableExists(lTableName & ":" & lIndex.ToString) Then lTempQual = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("GQID").Value) If aGQualName = lTempQual Then - 'found it - lUnits = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QTYID").Value) - End If + 'found it + lUnits = Trim(lOper.Tables(lTableName & ":" & lIndex.ToString).Parms("QTYID").Value) + Exit For + End If End If Next - Loop + 'Loop End If Return lUnits From 7cdcc984fb24f4f672c4e0e53334dc11b566241e Mon Sep 17 00:00:00 2001 From: "tong.zhai" Date: Mon, 12 Mar 2018 18:12:37 -0400 Subject: [PATCH 11/14] constituents key on name and fraction text select constituent first, change listing display of constituent with better speciation description --- .../clsWaterQualityDataUS.vb | 321 ++++++++++++++---- .../frmSelect.Designer.vb | 27 +- atcTimeseriesWaterQualUS/frmSelect.vb | 16 +- 3 files changed, 277 insertions(+), 87 deletions(-) diff --git a/atcTimeseriesWaterQualUS/clsWaterQualityDataUS.vb b/atcTimeseriesWaterQualUS/clsWaterQualityDataUS.vb index f4f44ede2..31b56e423 100644 --- a/atcTimeseriesWaterQualUS/clsWaterQualityDataUS.vb +++ b/atcTimeseriesWaterQualUS/clsWaterQualityDataUS.vb @@ -71,69 +71,133 @@ Public Class clsWQDUSColumns Return False End If For I As Integer = 0 To aRecord.Length - 1 - If aRecord(I).StartsWith("OrganizationIdentifier") Then colOrganizationIdentifier = I - If aRecord(I).StartsWith("OrganizationFormalName") Then colOrganizationFormalName = I - If aRecord(I).StartsWith("ActivityIdentifier") Then colActivityIdentifier = I - If aRecord(I).StartsWith("ActivityTypeCode") Then colActivityTypeCode = I - If aRecord(I).StartsWith("ActivityMediaName") Then colActivityMediaName = I - If aRecord(I).StartsWith("ActivityMediaSubdivisionName") Then colActivityMediaSubdivisionName = I - If aRecord(I).StartsWith("ActivityStartDate") Then colActivityStartDate = I - If aRecord(I).StartsWith("ActivityStartTime/Time") Then colActivityStartTime = I - If aRecord(I).StartsWith("ActivityStartTime/TimeZoneCode") Then colActivityStartTimeZoneCode = I - If aRecord(I).StartsWith("ActivityEndDate") Then colActivityEndDate = I - If aRecord(I).StartsWith("ActivityEndTime/Time") Then colActivityEndTime = I - If aRecord(I).StartsWith("ActivityEndTime/TimeZoneCode") Then colActivityEndTimeZoneCode = I - If aRecord(I).StartsWith("ActivityDepthHeightMeasure/MeasureValue") Then colActivityDepthHeightMeasureValue = I - If aRecord(I).StartsWith("ActivityDepthHeightMeasure/MeasureUnitCode") Then colActivityDepthHeightMeasureUnitCode = I - If aRecord(I).StartsWith("ActivityDepthAltitudeReferencePointText") Then colActivityDepthAltitudeReferencePointText = I - If aRecord(I).StartsWith("ActivityTopDepthHeightMeasure/MeasureValue") Then colActivityTopDepthHeightMeasureValue = I - If aRecord(I).StartsWith("ActivityTopDepthHeightMeasure/MeasureUnitCode") Then colActivityTopDepthHeightMeasureUnitCode = I - If aRecord(I).StartsWith("ActivityBottomDepthHeightMeasure/MeasureValue") Then colActivityBottomDepthHeightMeasureValue = I - If aRecord(I).StartsWith("ActivityBottomDepthHeightMeasure/MeasureUnitCode") Then colActivityBottomDepthHeightMeasureUnitCode = I - If aRecord(I).StartsWith("ProjectIdentifier") Then colProjectIdentifier = I - If aRecord(I).StartsWith("ActivityConductingOrganizationText") Then colActivityConductingOrganizationText = I - If aRecord(I).StartsWith("MonitoringLocationIdentifier") Then colMonitoringLocationIdentifier = I - If aRecord(I).StartsWith("ActivityCommentText") Then colActivityCommentText = I - If aRecord(I).StartsWith("SampleAquifer") Then colSampleAquifer = I - If aRecord(I).StartsWith("HydrologicCondition") Then colHydrologicCondition = I - If aRecord(I).StartsWith("HydrologicEvent") Then colHydrologicEvent = I - If aRecord(I).StartsWith("SampleCollectionMethod/MethodIdentifier") Then colSampleCollectionMethodIdentifier = I - If aRecord(I).StartsWith("SampleCollectionMethod/MethodIdentifierContext") Then colSampleCollectionMethodIdentifierContext = I - If aRecord(I).StartsWith("SampleCollectionMethod/MethodName") Then colSampleCollectionMethodName = I - If aRecord(I).StartsWith("SampleCollectionEquipmentName") Then colSampleCollectionEquipmentName = I - If aRecord(I).StartsWith("ResultDetectionConditionText") Then colResultDetectionConditionText = I - If aRecord(I).StartsWith("CharacteristicName") Then colCharacteristicName = I - If aRecord(I).StartsWith("ResultSampleFractionText") Then colResultSampleFractionText = I - If aRecord(I).StartsWith("ResultMeasureValue") Then colResultMeasureValue = I - If aRecord(I).StartsWith("ResultMeasure/MeasureUnitCode") Then colResultMeasureUnitCode = I - If aRecord(I).StartsWith("MeasureQualifierCode") Then colMeasureQualifierCode = I - If aRecord(I).StartsWith("ResultStatusIdentifier") Then colResultStatusIdentifier = I - If aRecord(I).StartsWith("StatisticalBaseCode") Then colStatisticalBaseCode = I - If aRecord(I).StartsWith("ResultValueTypeName") Then colResultValueTypeName = I - If aRecord(I).StartsWith("ResultWeightBasisText") Then colResultWeightBasisText = I - If aRecord(I).StartsWith("ResultTimeBasisText") Then colResultTimeBasisText = I - If aRecord(I).StartsWith("ResultTemperatureBasisText") Then colResultTemperatureBasisText = I - If aRecord(I).StartsWith("ResultParticleSizeBasisText") Then colResultParticleSizeBasisText = I - If aRecord(I).StartsWith("PrecisionValue") Then colPrecisionValue = I - If aRecord(I).StartsWith("ResultCommentText") Then colResultCommentText = I - If aRecord(I).StartsWith("USGSPCode") Then colUSGSPCode = I - If aRecord(I).StartsWith("ResultDepthHeightMeasure/MeasureValue") Then colResultDepthHeightMeasureValue = I - If aRecord(I).StartsWith("ResultDepthHeightMeasure/MeasureUnitCode") Then colResultDepthHeightMeasureUnitCode = I - If aRecord(I).StartsWith("ResultDepthAltitudeReferencePointText") Then colResultDepthAltitudeReferencePointText = I - If aRecord(I).StartsWith("SubjectTaxonomicName") Then colSubjectTaxonomicName = I - If aRecord(I).StartsWith("SampleTissueAnatomyName") Then colSampleTissueAnatomyName = I - If aRecord(I).StartsWith("ResultAnalyticalMethod/MethodIdentifier") Then colResultAnalyticalMethodIdentifier = I - If aRecord(I).StartsWith("ResultAnalyticalMethod/MethodIdentifierContext") Then colResultAnalyticalMethodIdentifierContext = I - If aRecord(I).StartsWith("ResultAnalyticalMethod/MethodName") Then colResultAnalyticalMethodName = I - If aRecord(I).StartsWith("MethodDescriptionText") Then colMethodDescriptionText = I - If aRecord(I).StartsWith("LaboratoryName") Then colLaboratoryName = I - If aRecord(I).StartsWith("AnalysisStartDate") Then colAnalysisStartDate = I - If aRecord(I).StartsWith("ResultLaboratoryCommentText") Then colResultLaboratoryCommentText = I - If aRecord(I).StartsWith("DetectionQuantitationLimitTypeName") Then colDetectionQuantitationLimitTypeName = I - If aRecord(I).StartsWith("DetectionQuantitationLimitMeasure/MeasureValue") Then colDetectionQuantitationLimitMeasureValue = I - If aRecord(I).StartsWith("DetectionQuantitationLimitMeasure/MeasureUnitCode") Then colDetectionQuantitationLimitMeasureUnitCode = I - If aRecord(I).StartsWith("PreparationStartDate") Then colPreparationStartDate = I - If aRecord(I).StartsWith("ProviderName") Then colProviderName = I + If aRecord(I).StartsWith("OrganizationIdentifier") Then + colOrganizationIdentifier = I + ElseIf aRecord(I).StartsWith("OrganizationFormalName") Then + colOrganizationFormalName = I + ElseIf aRecord(I).StartsWith("ActivityIdentifier") Then + colActivityIdentifier = I + ElseIf aRecord(I).StartsWith("ActivityTypeCode") Then + colActivityTypeCode = I + ElseIf aRecord(I).StartsWith("ActivityMediaName") Then + colActivityMediaName = I + ElseIf aRecord(I).StartsWith("ActivityMediaSubdivisionName") Then + colActivityMediaSubdivisionName = I + ElseIf aRecord(I).StartsWith("ActivityStartDate") Then + colActivityStartDate = I + ElseIf aRecord(I).StartsWith("ActivityStartTime/TimeZoneCode") Then + colActivityStartTimeZoneCode = I + ElseIf aRecord(I).StartsWith("ActivityStartTime/Time") Then + colActivityStartTime = I + ElseIf aRecord(I).StartsWith("ActivityEndDate") Then + colActivityEndDate = I + ElseIf aRecord(I).StartsWith("ActivityEndTime/TimeZoneCode") Then + colActivityEndTimeZoneCode = I + ElseIf aRecord(I).StartsWith("ActivityEndTime/Time") Then + colActivityEndTime = I + ElseIf aRecord(I).StartsWith("ActivityDepthHeightMeasure/MeasureValue") Then + colActivityDepthHeightMeasureValue = I + ElseIf aRecord(I).StartsWith("ActivityDepthHeightMeasure/MeasureUnitCode") Then + colActivityDepthHeightMeasureUnitCode = I + ElseIf aRecord(I).StartsWith("ActivityDepthAltitudeReferencePointText") Then + colActivityDepthAltitudeReferencePointText = I + ElseIf aRecord(I).StartsWith("ActivityTopDepthHeightMeasure/MeasureValue") Then + colActivityTopDepthHeightMeasureValue = I + ElseIf aRecord(I).StartsWith("ActivityTopDepthHeightMeasure/MeasureUnitCode") Then + colActivityTopDepthHeightMeasureUnitCode = I + ElseIf aRecord(I).StartsWith("ActivityBottomDepthHeightMeasure/MeasureValue") Then + colActivityBottomDepthHeightMeasureValue = I + ElseIf aRecord(I).StartsWith("ActivityBottomDepthHeightMeasure/MeasureUnitCode") Then + colActivityBottomDepthHeightMeasureUnitCode = I + ElseIf aRecord(I).StartsWith("ProjectIdentifier") Then + colProjectIdentifier = I + ElseIf aRecord(I).StartsWith("ActivityConductingOrganizationText") Then + colActivityConductingOrganizationText = I + ElseIf aRecord(I).StartsWith("MonitoringLocationIdentifier") Then + colMonitoringLocationIdentifier = I + ElseIf aRecord(I).StartsWith("ActivityCommentText") Then + colActivityCommentText = I + ElseIf aRecord(I).StartsWith("SampleAquifer") Then + colSampleAquifer = I + ElseIf aRecord(I).StartsWith("HydrologicCondition") Then + colHydrologicCondition = I + ElseIf aRecord(I).StartsWith("HydrologicEvent") Then + colHydrologicEvent = I + ElseIf aRecord(I).StartsWith("SampleCollectionMethod/MethodIdentifierContext") Then + colSampleCollectionMethodIdentifierContext = I + ElseIf aRecord(I).StartsWith("SampleCollectionMethod/MethodIdentifier") Then + colSampleCollectionMethodIdentifier = I + ElseIf aRecord(I).StartsWith("SampleCollectionMethod/MethodName") Then + colSampleCollectionMethodName = I + ElseIf aRecord(I).StartsWith("SampleCollectionEquipmentName") Then + colSampleCollectionEquipmentName = I + ElseIf aRecord(I).StartsWith("ResultDetectionConditionText") Then + colResultDetectionConditionText = I + ElseIf aRecord(I).StartsWith("CharacteristicName") Then + colCharacteristicName = I + ElseIf aRecord(I).StartsWith("ResultSampleFractionText") Then + colResultSampleFractionText = I + ElseIf aRecord(I).StartsWith("ResultMeasureValue") Then + colResultMeasureValue = I + ElseIf aRecord(I).StartsWith("ResultMeasure/MeasureUnitCode") Then + colResultMeasureUnitCode = I + ElseIf aRecord(I).StartsWith("MeasureQualifierCode") Then + colMeasureQualifierCode = I + ElseIf aRecord(I).StartsWith("ResultStatusIdentifier") Then + colResultStatusIdentifier = I + ElseIf aRecord(I).StartsWith("StatisticalBaseCode") Then + colStatisticalBaseCode = I + ElseIf aRecord(I).StartsWith("ResultValueTypeName") Then + colResultValueTypeName = I + ElseIf aRecord(I).StartsWith("ResultWeightBasisText") Then + colResultWeightBasisText = I + ElseIf aRecord(I).StartsWith("ResultTimeBasisText") Then + colResultTimeBasisText = I + ElseIf aRecord(I).StartsWith("ResultTemperatureBasisText") Then + colResultTemperatureBasisText = I + ElseIf aRecord(I).StartsWith("ResultParticleSizeBasisText") Then + colResultParticleSizeBasisText = I + ElseIf aRecord(I).StartsWith("PrecisionValue") Then + colPrecisionValue = I + ElseIf aRecord(I).StartsWith("ResultCommentText") Then + colResultCommentText = I + ElseIf aRecord(I).StartsWith("USGSPCode") Then + colUSGSPCode = I + ElseIf aRecord(I).StartsWith("ResultDepthHeightMeasure/MeasureValue") Then + colResultDepthHeightMeasureValue = I + ElseIf aRecord(I).StartsWith("ResultDepthHeightMeasure/MeasureUnitCode") Then + colResultDepthHeightMeasureUnitCode = I + ElseIf aRecord(I).StartsWith("ResultDepthAltitudeReferencePointText") Then + colResultDepthAltitudeReferencePointText = I + ElseIf aRecord(I).StartsWith("SubjectTaxonomicName") Then + colSubjectTaxonomicName = I + ElseIf aRecord(I).StartsWith("SampleTissueAnatomyName") Then + colSampleTissueAnatomyName = I + ElseIf aRecord(I).StartsWith("ResultAnalyticalMethod/MethodIdentifierContext") Then + colResultAnalyticalMethodIdentifierContext = I + ElseIf aRecord(I).StartsWith("ResultAnalyticalMethod/MethodIdentifier") Then + colResultAnalyticalMethodIdentifier = I + ElseIf aRecord(I).StartsWith("ResultAnalyticalMethod/MethodName") Then + colResultAnalyticalMethodName = I + ElseIf aRecord(I).StartsWith("MethodDescriptionText") Then + colMethodDescriptionText = I + ElseIf aRecord(I).StartsWith("LaboratoryName") Then + colLaboratoryName = I + ElseIf aRecord(I).StartsWith("AnalysisStartDate") Then + colAnalysisStartDate = I + ElseIf aRecord(I).StartsWith("ResultLaboratoryCommentText") Then + colResultLaboratoryCommentText = I + ElseIf aRecord(I).StartsWith("DetectionQuantitationLimitTypeName") Then + colDetectionQuantitationLimitTypeName = I + ElseIf aRecord(I).StartsWith("DetectionQuantitationLimitMeasure/MeasureValue") Then + colDetectionQuantitationLimitMeasureValue = I + ElseIf aRecord(I).StartsWith("DetectionQuantitationLimitMeasure/MeasureUnitCode") Then + colDetectionQuantitationLimitMeasureUnitCode = I + ElseIf aRecord(I).StartsWith("PreparationStartDate") Then + colPreparationStartDate = I + ElseIf aRecord(I).StartsWith("ProviderName") Then + colProviderName = I + End If Next Return IsValidColumns() End Function @@ -341,17 +405,20 @@ Public Class clsWQDUSLocations Public Locations As New Dictionary(Of String, clsWQDUSLocation)() Public ReadOnly Property GetUniqueConstituentList() As List(Of String) Get - Dim lst As New List(Of String)() + Dim lsortedPreferred As New SortedList(Of String, Integer)() + Dim lstNonPreferred As New SortedList(Of String, Integer)() + Dim lKey As String For Each loc As clsWQDUSLocation In Locations.Values For Each cons As clsWQDUSConstituent In loc.Constituents.Values For Each ldata_unit As String In cons.RecordGroup.Keys - If Not lst.Contains(cons.Name & "-" & ldata_unit) Then - lst.Add(cons.Name & "-" & ldata_unit) + lKey = cons.Name & "-" & ldata_unit + If Not lstNonPreferred.ContainsKey(lKey) Then + lstNonPreferred.Add(lKey, 1) End If Next Next Next - Return lst + Return lstNonPreferred.Keys.ToList() End Get End Property @@ -410,6 +477,7 @@ Public Class clsWQDUSLocation Public Sub AddData(ByVal aRecord() As String) Dim lname As String = aRecord(clsWQDUSColumns.colCharacteristicName) Dim lunit As String = aRecord(clsWQDUSColumns.colResultMeasureUnitCode) + Dim lfraction As String = aRecord(clsWQDUSColumns.colResultSampleFractionText) 'For I As Integer = 0 To aRecord.Length - 1 ' If aRecord(I) = "Nitrate as N" Then @@ -417,18 +485,23 @@ Public Class clsWQDUSLocation ' End If 'Next + Dim lcons_key As String = lname + If Not String.IsNullOrEmpty(lfraction) Then + lcons_key = lname & "-" & lfraction + End If If Not String.IsNullOrEmpty(lname) AndAlso lname.ToLower() = "nitrate as n" Then lname = "Nitrate" + lcons_key = lname & "-" & lfraction aRecord(clsWQDUSColumns.colCharacteristicName) = lname If lunit = "mg/l" Then lunit = "mg/l as N" aRecord(clsWQDUSColumns.colResultMeasureUnitCode) = lunit End If End If - If Not Constituents.ContainsKey(lname) Then - Constituents.Add(lname, New clsWQDUSConstituent(lname)) + If Not Constituents.ContainsKey(lcons_key) Then + Constituents.Add(lcons_key, New clsWQDUSConstituent(lcons_key)) End If - Constituents.Item(lname).AddData(aRecord) + Constituents.Item(lcons_key).AddData(aRecord) End Sub End Class @@ -461,6 +534,17 @@ Public Class clsWQDUSConstituent Return lst End Get End Property + Public ReadOnly Property SampleFraction(ByVal aUnit As String) As List(Of String) + Get + Dim list As New List(Of String)() + For Each ldp As clsWQDUSDataPoint In RecordGroup.Item(aUnit) + If Not String.IsNullOrEmpty(ldp.ResultSampleFractionText) AndAlso Not list.Contains(ldp.ResultSampleFractionText) Then + list.Add(ldp.ResultSampleFractionText) + End If + Next + Return list + End Get + End Property Public Sub New(ByVal aName As String) Name = aName End Sub @@ -470,6 +554,8 @@ Public Class clsWQDUSConstituent With lDataPoint .sDate = aRecord(clsWQDUSColumns.colActivityStartDate) .sTime = aRecord(clsWQDUSColumns.colActivityStartTime) + .ResultSampleFractionText = aRecord(clsWQDUSColumns.colResultSampleFractionText) + .ResultStatusIdentifier = aRecord(clsWQDUSColumns.colResultStatusIdentifier) If Not String.IsNullOrEmpty(aRecord(clsWQDUSColumns.colResultMeasureValue)) Then .Value = aRecord(clsWQDUSColumns.colResultMeasureValue) .Unit = aRecord(clsWQDUSColumns.colResultMeasureUnitCode) @@ -507,6 +593,8 @@ Public Class clsWQDUSDataPoint Public Value As String Public Unit As String Public Attrib As String + Public ResultSampleFractionText As String + Public ResultStatusIdentifier As String Public Resulttype As String Public atcDataTime As Double = -1 Public vbDataTime As DateTime @@ -518,9 +606,13 @@ Public Class clsWQDUSDataPoint ldates(0) = vbDataTime.Year ldates(1) = vbDataTime.Month ldates(2) = vbDataTime.Day - ldates(3) = vbDataTime.Hour - ldates(4) = vbDataTime.Minute - ldates(5) = vbDataTime.Second + If String.IsNullOrEmpty(sTime) OrElse sTime.IndexOf(":") < 0 Then + ldates(3) = 24 + Else + ldates(3) = vbDataTime.Hour + ldates(4) = vbDataTime.Minute + ldates(5) = vbDataTime.Second + End If ElseIf DateTime.TryParse(sDate, vbDataTime) Then ldates(0) = vbDataTime.Year ldates(1) = vbDataTime.Month @@ -535,3 +627,86 @@ Public Class clsWQDUSDataPoint End Function End Class +Public Class clsWQDUSPreferred + Public Shared WaterQuality As New List(Of String)() + Public Shared WaterQualitySpecies As New List(Of String)() + Shared Sub New() + With WaterQuality + .Add("Ammonia-Nitrogen as N") + .Add("Biochemical Oxygen Demand") + .Add("Carbonaceous biochemical oxygen demand") + .Add("Dissolved Oxygen") + .Add("Total Suspended Solids") + .Add("Temperature, Water") + .Add("Chlorophyll a") + .Add("Escherichia Coli") + .Add("Fecal Coliform") + .Add("Flow") + .Add("Gage height") + .Add("Inorganic Nitrogen (nitrate and nitrite) as N") + .Add("Kjeldahl Nitrogen") + .Add("Nitrate as N") + .Add("Nitrite as N") + .Add("Nitrogen, mixed forms (NH3), (NH44), organic, (NO2), and (NO3)") + .Add("Organic carbon") + .Add("Organic Nitrogen") + .Add("Orthophosphate as P") + .Add("pH") + .Add("Phosphate-phosphorus as P") + .Add("Phosphorus") + .Add("Stream flow, instantaneous") + .Add("Sulfate") + .Add("Total Phosphorus, mixed forms") + End With + With WaterQualitySpecies + .Add("Ammonia") + .Add("Biochemical Oxygen Demand") + .Add("Carbonaceous biochemical oxygen demand") + .Add("Dissolved Oxygen") + .Add("Total Suspended Solids") + .Add("Temperature, Water") + .Add("Chlorophyll a") + .Add("Escherichia Coli") + .Add("Fecal Coliform") + .Add("Flow") + .Add("Gage height") + .Add("Inorganic Nitrogen (nitrate and nitrite)") + .Add("Kjeldahl Nitrogen") + .Add("Nitrate") + .Add("Nitrite") + .Add("Nitrogen, mixed forms (NH3), (NH44), organic, (NO2), and (NO3)") + .Add("Organic carbon") + .Add("Organic Nitrogen") + .Add("Orthophosphate") + .Add("pH") + .Add("Phosphate") + .Add("Phosphate-phosphorus") + .Add("Phosphorus") + .Add("Stream flow, instantaneous") + .Add("Sulfate") + .Add("Total Phosphorus, mixed forms") + End With + End Sub + Public Shared Function IsPreferredWaterQuality(ByVal aSpecies As String) As Boolean + If String.IsNullOrEmpty(aSpecies) Then + Return False + End If + Dim lIsPreferred As Boolean = False + For Each species As String In WaterQualitySpecies + If aSpecies.ToLower().StartsWith(species.ToLower()) Then + If species = "pH" Then + If aSpecies.StartsWith(species) Then + lIsPreferred = True + End If + Else + lIsPreferred = True + End If + If lIsPreferred Then + Exit For + End If + End If + Next + Return lIsPreferred + End Function +End Class + diff --git a/atcTimeseriesWaterQualUS/frmSelect.Designer.vb b/atcTimeseriesWaterQualUS/frmSelect.Designer.vb index ef78c797d..8b1897df1 100644 --- a/atcTimeseriesWaterQualUS/frmSelect.Designer.vb +++ b/atcTimeseriesWaterQualUS/frmSelect.Designer.vb @@ -39,20 +39,22 @@ Partial Class frmSelect ' 'lstLocations ' - Me.lstLocations.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Me.lstLocations.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ + Or System.Windows.Forms.AnchorStyles.Left) _ Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.lstLocations.FormattingEnabled = True - Me.lstLocations.Location = New System.Drawing.Point(6, 19) + Me.lstLocations.Location = New System.Drawing.Point(6, 20) Me.lstLocations.Name = "lstLocations" Me.lstLocations.Size = New System.Drawing.Size(313, 259) Me.lstLocations.TabIndex = 0 ' 'lstConstituents ' - Me.lstConstituents.Anchor = CType(((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Left) _ + Me.lstConstituents.Anchor = CType((((System.Windows.Forms.AnchorStyles.Top Or System.Windows.Forms.AnchorStyles.Bottom) _ + Or System.Windows.Forms.AnchorStyles.Left) _ Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.lstConstituents.FormattingEnabled = True - Me.lstConstituents.Location = New System.Drawing.Point(6, 19) + Me.lstConstituents.Location = New System.Drawing.Point(3, 19) Me.lstConstituents.Name = "lstConstituents" Me.lstConstituents.Size = New System.Drawing.Size(317, 259) Me.lstConstituents.TabIndex = 1 @@ -60,7 +62,7 @@ Partial Class frmSelect 'Label1 ' Me.Label1.AutoSize = True - Me.Label1.Location = New System.Drawing.Point(3, 3) + Me.Label1.Location = New System.Drawing.Point(3, 4) Me.Label1.Name = "Label1" Me.Label1.Size = New System.Drawing.Size(53, 13) Me.Label1.TabIndex = 2 @@ -84,22 +86,23 @@ Partial Class frmSelect ' 'spaneMain.Panel1 ' - Me.spaneMain.Panel1.Controls.Add(Me.btnClearLoc) - Me.spaneMain.Panel1.Controls.Add(Me.lstLocations) - Me.spaneMain.Panel1.Controls.Add(Me.Label1) + Me.spaneMain.Panel1.Controls.Add(Me.lstConstituents) + Me.spaneMain.Panel1.Controls.Add(Me.Label2) + Me.spaneMain.Panel1.Controls.Add(Me.btnClearCons) ' 'spaneMain.Panel2 ' + Me.spaneMain.Panel2.Controls.Add(Me.btnClearLoc) Me.spaneMain.Panel2.Controls.Add(Me.txtMsgCons) - Me.spaneMain.Panel2.Controls.Add(Me.btnClearCons) - Me.spaneMain.Panel2.Controls.Add(Me.lstConstituents) - Me.spaneMain.Panel2.Controls.Add(Me.Label2) + Me.spaneMain.Panel2.Controls.Add(Me.Label1) + Me.spaneMain.Panel2.Controls.Add(Me.lstLocations) Me.spaneMain.Size = New System.Drawing.Size(658, 398) Me.spaneMain.SplitterDistance = 325 Me.spaneMain.TabIndex = 4 ' 'btnClearLoc ' + Me.btnClearLoc.Anchor = CType((System.Windows.Forms.AnchorStyles.Bottom Or System.Windows.Forms.AnchorStyles.Right), System.Windows.Forms.AnchorStyles) Me.btnClearLoc.Location = New System.Drawing.Point(6, 285) Me.btnClearLoc.Name = "btnClearLoc" Me.btnClearLoc.Size = New System.Drawing.Size(50, 23) @@ -122,7 +125,7 @@ Partial Class frmSelect ' 'btnClearCons ' - Me.btnClearCons.Location = New System.Drawing.Point(6, 285) + Me.btnClearCons.Location = New System.Drawing.Point(6, 282) Me.btnClearCons.Name = "btnClearCons" Me.btnClearCons.Size = New System.Drawing.Size(50, 23) Me.btnClearCons.TabIndex = 4 diff --git a/atcTimeseriesWaterQualUS/frmSelect.vb b/atcTimeseriesWaterQualUS/frmSelect.vb index da5f60723..80f280178 100644 --- a/atcTimeseriesWaterQualUS/frmSelect.vb +++ b/atcTimeseriesWaterQualUS/frmSelect.vb @@ -28,10 +28,22 @@ Public Class frmSelect lstLocations.Items().Add(loc) Next lSortedList.Clear() + Dim lSortedListPreferred As New SortedList(Of String, Integer)() For Each cons As String In aRawDataGroup.GetUniqueConstituentList() - lSortedList.Add(cons, 0) + If clsWQDUSPreferred.IsPreferredWaterQuality(cons) Then + If Not lSortedListPreferred.ContainsKey(cons) Then + lSortedListPreferred.Add(cons, 0) + End If + Else + If Not lSortedList.ContainsKey(cons) Then + lSortedList.Add(cons, 0) + End If + End If + Next + For Each cons As String In lSortedListPreferred.Keys() + lstConstituents.Items().Add(cons) Next - For Each cons As String In lSortedList.Keys + For Each cons As String In lSortedList.Keys() lstConstituents.Items().Add(cons) Next End Sub From e5a5a0a7ef67827f2512582df4d2b102ba8cd411 Mon Sep 17 00:00:00 2001 From: Anurag Mishra Date: Mon, 12 Mar 2018 20:34:29 -0700 Subject: [PATCH 12/14] Fixed Code to account for GQUAL Multiple Exit Bug --- atcHspfSupport/atcConstituentTables.vb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/atcHspfSupport/atcConstituentTables.vb b/atcHspfSupport/atcConstituentTables.vb index e341f858a..b4084c446 100644 --- a/atcHspfSupport/atcConstituentTables.vb +++ b/atcHspfSupport/atcConstituentTables.vb @@ -2189,14 +2189,14 @@ Public Module atcConstituentTables lDiversion = aOutflow - lTotalOutFlow Case Else - lExitFlowConstituent = aConstituent & "-TOSQAL-EXIT" & lExitNUmber + lExitFlowConstituent = aConstituent & "-OSQAL-TOT-" & lExitNUmber lTimeSeries = aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). FindData("Constituent", lExitFlowConstituent)(0) If Not lTimeSeries Is Nothing Then lTotalOutFlow = lTimeSeries.Attributes.GetDefinedValue("SumAnnual").Value End If - lExitFlowConstituent = aConstituent & "-ODQAL-EXIT" & lExitNUmber + lExitFlowConstituent = aConstituent & "-TOSQAL-EXIT" & lExitNUmber lTimeSeries = aBinaryDataSource.DataSets.FindData("Location", "R:" & aReach.Id). FindData("Constituent", lExitFlowConstituent)(0) If Not lTimeSeries Is Nothing Then From c84cb461220e50a777eff0260c7207ca1f48c8b1 Mon Sep 17 00:00:00 2001 From: PaulDudaATC Date: Tue, 13 Mar 2018 10:37:29 -0400 Subject: [PATCH 13/14] add check to Total N tables to see if atmos dep is in use --- atcHspfSupport/atcConstituentTables.vb | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/atcHspfSupport/atcConstituentTables.vb b/atcHspfSupport/atcConstituentTables.vb index e341f858a..01fc05c88 100644 --- a/atcHspfSupport/atcConstituentTables.vb +++ b/atcHspfSupport/atcConstituentTables.vb @@ -1513,8 +1513,11 @@ Public Module atcConstituentTables Dim lTotalIn As Double = SubsetByDate(aBinaryData.DataSets.FindData("Location", LocationName).FindData("Constituent", lReachConstituent & "-INTOT")(0), aSDateJ, aEDateJ, Nothing).Attributes.GetDefinedValue("SumAnnual").Value - Dim lTotalAtmDep As Double = SubsetByDate(aBinaryData.DataSets.FindData("Location", LocationName).FindData("Constituent", lReachConstituent & "-ATMDEPTOT")(0), - aSDateJ, aEDateJ, Nothing).Attributes.GetDefinedValue("SumAnnual").Value + Dim lTotalAtmDep As Double = 0.0 + If aBinaryData.DataSets.FindData("Location", LocationName).FindData("Constituent", lReachConstituent & "-ATMDEPTOT").Count > 0 Then + lTotalAtmDep = SubsetByDate(aBinaryData.DataSets.FindData("Location", LocationName).FindData("Constituent", lReachConstituent & "-ATMDEPTOT")(0), + aSDateJ, aEDateJ, Nothing).Attributes.GetDefinedValue("SumAnnual").Value + End If Dim lProcFluxTot As Double = SubsetByDate(aBinaryData.DataSets.FindData("Location", LocationName).FindData("Constituent", lReachConstituent & "-PROCFLUX-TOT")(0), aSDateJ, aEDateJ, Nothing).Attributes.GetDefinedValue("SumAnnual").Value If lReachConstituent = "NO3" Then @@ -1559,9 +1562,10 @@ Public Module atcConstituentTables Case lReachConstituent & "-OUTTOT" row(ColumnName) = lOutflow Case Else - row(ColumnName) = HspfTable.NumFmtRE(SubsetByDate(aBinaryData.DataSets.FindData("Location", LocationName).FindData("Constituent", ColumnName)(0), + If aBinaryData.DataSets.FindData("Location", LocationName).FindData("Constituent", ColumnName).Count > 0 Then + row(ColumnName) = HspfTable.NumFmtRE(SubsetByDate(aBinaryData.DataSets.FindData("Location", LocationName).FindData("Constituent", ColumnName)(0), aSDateJ, aEDateJ, Nothing).Attributes.GetDefinedValue("SumAnnual").Value, 10) - + End If End Select Next columnValue From f0b7ea3e25a11fce77c638f51359ba837482b0a1 Mon Sep 17 00:00:00 2001 From: Jack Kittle Date: Tue, 13 Mar 2018 11:45:45 -0400 Subject: [PATCH 14/14] Add files via upload defer reading of result timeseries until needed to conserve memory --- .../atcDataSourceTimeseriesHDF5.vb | 119 +++++++++++++++--- 1 file changed, 105 insertions(+), 14 deletions(-) diff --git a/atcTimeseriesHDF5/atcDataSourceTimeseriesHDF5.vb b/atcTimeseriesHDF5/atcDataSourceTimeseriesHDF5.vb index 242abe80f..6cd5c7ff1 100644 --- a/atcTimeseriesHDF5/atcDataSourceTimeseriesHDF5.vb +++ b/atcTimeseriesHDF5/atcDataSourceTimeseriesHDF5.vb @@ -49,18 +49,29 @@ Public Class atcDataSourceTimeseriesHSF5 End Get End Property - Public ReadOnly Property Label() As String Get Return "HDF5" End Get End Property + ''' + ''' timeseries class for HDF5 files produced by HSP2, read only for now + ''' + ''' name of existing hdf5 file, if missing or blank - query user for name + ''' optional options + ''' Public Overrides Function Open(ByVal aFileName As String, Optional ByVal aAttributes As atcData.atcDataAttributes = Nothing) As Boolean Dim lAttributes As atcData.atcDataAttributes = aAttributes - If lAttributes Is Nothing Then + If lAttributes Is Nothing Then 'no options provided, provide empty class to avoid problems lAttributes = New atcData.atcDataAttributes + Else 'summarize options + Debug.Print("OpenHDF5 File:'" & aFileName & "' Options:") + For Each lAttribue As atcData.atcDefinedValue In lAttributes + Debug.Print(lAttribue.Definition.Name & ":" & lAttribue.Value) + Next End If + If MyBase.Open(aFileName, lAttributes) Then H5.Open() Debug.Print("H5Version " & H5.Version.Major & ":" & H5.Version.Minor) @@ -71,8 +82,7 @@ Public Class atcDataSourceTimeseriesHSF5 Dim lGrpId As H5GroupId Dim lAtCnt As Integer - If lAttributes.GetValue("ProcessInputTS", True) Then - 'input timeseries + If lAttributes.GetValue("ProcessInputTS", True) Then 'input timeseries lGrpName = "/TIMESERIES" lGrpId = H5G.open(lFileId, lGrpName) lAtCnt = H5A.getNumberOfAttributes(lGrpId) @@ -82,6 +92,7 @@ Public Class atcDataSourceTimeseriesHSF5 For lTsID As Integer = 0 To lCnt - 1 Dim lTsName As String = H5G.getObjectNameByIndex(lGrpId, lTsID) If lTsName.StartsWith("TS") Then + 'cant use dates from earlier thimeseries because each one is independent! AddDataSet(BuildTimeSeries(lGrpId, lTsName, "OBSERVED")) End If Next @@ -90,11 +101,17 @@ Public Class atcDataSourceTimeseriesHSF5 Debug.Print("Input Timeseries Skipped " & DataSets.Count) End If - If lAttributes.GetValue("ProcessOutputTS", True) Then - 'output timeseries + If lAttributes.GetValue("ProcessOutputTS", True) Then 'output timeseries Dim lOutputConstituent As String = lAttributes.GetValue("OutputConstituent", "") Dim lOutputLocation As String = lAttributes.GetValue("OutputLocation", "") + Dim lOutputSection As New atcAttributeDefinition + lOutputSection.Name = "OutputSection" + lOutputSection.DefaultValue = Nothing + Dim lOutputColumn As New atcAttributeDefinition + lOutputColumn.Name = "OutputColumn" + lOutputColumn.DefaultValue = Nothing + lGrpName = "/RESULTS" lGrpId = H5G.open(lFileId, lGrpName) lAtCnt = H5A.getNumberOfAttributes(lGrpId) @@ -132,13 +149,20 @@ Public Class atcDataSourceTimeseriesHSF5 lTimeSeries.Attributes.Add("Constituent", lConsName) lTimeSeries.Attributes.Add("Location", lOpnName) lTimeSeries.Attributes.Add("Scenario", "Simulated") - If lConsDateDatasetIndex < 200 Then 'too many datasets run out of memory, need to just build headers then read data as needed - If DataSets.Count <> lConsDateDatasetIndex Then 'use dates from first dataset in this group - lTimeSeries.Dates = DataSets(lConsDateDatasetIndex).Dates.Clone - End If - ReadDatesAndData(lTimeSeries, lSecId, "axis1", "block0_values", lConInd) - AddDataSet(lTimeSeries) + If DataSets.Count <> lConsDateDatasetIndex Then 'use dates from first dataset in this group + lTimeSeries.Dates = DataSets(lConsDateDatasetIndex).Dates 'reference, don't want copy/clone! + Else + ReadDates(lTimeSeries, lSecId, "axis1") End If + 'too many datasets run out of memory, need to just build headers then read data as needed + With lTimeSeries + .numValues = lTimeSeries.Dates.numValues + .Attributes.Add(New atcDefinedValue(lOutputSection, lSecId)) + .Attributes.Add(New atcDefinedValue(lOutputColumn, lConInd)) + lTimeSeries.Dates.Attributes.Add("Shared", True) + .ValuesNeedToBeRead = True + End With + AddDataSet(lTimeSeries) End If Next Next @@ -155,7 +179,7 @@ Public Class atcDataSourceTimeseriesHSF5 Filter = pFilter End Sub - Private Function BuildTimeSeries(aGrpID As H5LocId, aTsName As String, aScenario As String) As atcTimeseries + Private Function BuildTimeSeries(aGrpID As H5LocId, aTsName As String, aScenario As String, Optional aDatesTS As atcTimeseries = Nothing) As atcTimeseries Dim lTsGrpId As H5GroupId = H5G.open(aGrpID, aTsName) Dim lTsAtCnt As Integer = H5A.getNumberOfAttributes(lTsGrpId) @@ -203,13 +227,80 @@ Public Class atcDataSourceTimeseriesHSF5 Next lTimeSeries.Attributes.Add("Name", aTsName) + If IsNothing(aDatesTS) Then + ReadDates(lTimeSeries, lTsGrpId, "index") + Else + lTimeSeries.Dates = aDatesTS.Dates + End If + ReadDatesAndData(lTimeSeries, lTsGrpId, "index", "values") Return lTimeSeries End Function - Private Sub ReadDatesAndData(aTimeseries As atcTimeseries, aTsGrpId As H5GroupId, aDateTableName As String, aDataTableName As String, Optional aColumn As Integer = -1) + Private Sub ReadDates(aTimeseries As atcTimeseries, aTsGrpId As H5GroupId, aDateTableName As String) + Dim lNumValues As Integer + If IsNothing(aTimeseries.Dates) Then 'need dates + Dim lDateGrpId As H5DataSetId = H5D.open(aTsGrpId, aDateTableName) + Dim lDateStorageSize As Integer = H5D.getStorageSize(lDateGrpId) + lNumValues = lDateStorageSize / 8 + Dim lDates(lNumValues - 1) As Long + Dim lDateTypeId As H5DataTypeId = H5D.getType(lDateGrpId) + H5D.read(Of Int64)(lDateGrpId, lDateTypeId, New H5Array(Of Long)(lDates)) + Debug.Print(lDateStorageSize.ToString & ":" & lNumValues.ToString & ":" & lDates(0).ToString) + Dim lDateBase As New System.DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Local) + Dim lDateNow As System.DateTime = lDateBase.AddMilliseconds(lDates(0) / (10 ^ 6)) + Dim lDatesJ(lNumValues) As Double + For lIndex As Integer = 0 To lNumValues - 1 + lDateNow = lDateBase.AddMilliseconds(lDates(lIndex) / (10 ^ 6)) + With lDateNow + lDatesJ(lIndex) = Date2J(.Year, .Month, .Day, .Hour, .Minute, .Second) + End With + If lIndex < 3 Or lIndex > lNumValues - 2 Then + Debug.Print(lDateNow.ToString & ":" & DumpDate(lDatesJ(lIndex))) + End If + Next + lDatesJ(lNumValues) = (2 * (lDatesJ(lNumValues - 1))) - lDatesJ(lNumValues - 2) + Debug.Print(DumpDate(lDatesJ(lNumValues))) + aTimeseries.Dates = New atcTimeseries(Me) + aTimeseries.Dates.Values = lDatesJ + Else + Debug.Print("Why?") + End If + End Sub + + Public Overrides Sub ReadData(ByVal aData As atcDataSet) + If aData.Attributes.GetValue("OutputSection") Is Nothing Then + 'data has been read + Else + Debug.Print("Need to read data for " & aData.ToString) + Dim lTimeseries As atcTimeseries = aData + Dim lNumValues As Integer = lTimeseries.Dates.numValues + Dim lColumn As Integer = lTimeseries.Attributes.GetValue("OutputColumn") + Dim lGroupId As H5GroupId = lTimeseries.Attributes.GetValue("OutputSection") + Dim lValueGrpId As H5DataSetId = H5D.open(lGroupId, "block0_values") + + Dim lValuesArraySize As Integer = H5D.getStorageSize(lValueGrpId) / 4 + Dim lValueArraySize As Integer = lTimeseries.Dates.numValues + Dim lValueColumns As Integer = lValuesArraySize / lValueArraySize + Dim lValues(lValuesArraySize - 1) As Single + Dim lValueTypeId As H5DataTypeId = H5D.getType(lValueGrpId) + 'read all data (may be multiple ts) + H5D.read(Of Single)(lValueGrpId, lValueTypeId, New H5Array(Of Single)(lValues)) + Debug.Print(lValuesArraySize.ToString & ":" & lValueArraySize.ToString & ":" & lValues(0).ToString & ":" & lValues(1).ToString) + ReDim lTimeseries.Values(lNumValues) + For lIndex As Integer = 1 To lNumValues + Dim lArrayIndex As Integer = (lValueColumns * (lIndex - 1)) + lColumn + lTimeseries.Values(lIndex) = lValues(lArrayIndex) + Next lIndex + + lTimeseries.SetInterval() + lTimeseries.Attributes.CalculateAll() + End If + End Sub + + Private Sub ReadDatesAndData(aTimeseries As atcTimeseries, aTsGrpId As H5GroupId, aDateTableName As String, aDataTableName As String, Optional aColumn As Integer = -1) Dim lNumValues As Integer Dim lColumn As Integer = aColumn If lColumn < 0 Then lColumn = 0