# Example PGM - Species Check

Navigation: PGMs - Example PGM Files - PGM Files using Class and Functions

# General Notes

1. The PGM can be added to any project, the check is performed at the end of project solve. If the project is very large (with thousands of pipes and hundreds of species), user may need to change the PlantModel - FlwSolve - PGM_ExecuteTimeout value to allow SysCAD more time to finish the calculations.
2. The species list display length may need to be adjusted if the number of species with flow or with no flow is greater than 100.
3. The following PGM examples demonstrate the use of the many pre-defined classes and functions:
• Species Database Class - how to fetch species data information
• Tagselect - apply a search criteria to select relevant models. In the examples below, it will search for models that belong to the stream unit group only, that is, Pipes and makeup streams.
• String Array - how to store a list a string variables (eg: species flow list, species no flow list)
• Array - how to used array to store value and apply array summation. (see Example 2)
• String Functions - how to apply string comparison (See Example 3)

# Example 1 - Species with Flow List

The following PGM can be used to check if a certain species is used by the project (has flow) :

• The PGM will search through each species in the project, if the species has flow it will be added to the "Species_With_Flow" list.
• The "Species With Flow" list can be used to create stream reports, as it will help shorten the list of species.
• See General Notes
PageLabel("CheckSpecies")
TextLabel(, "  --Time out value may need to be adjusted for large projects--" )
Real  PGM_time_out*("Time", "s")<<300>>
TextLabel(, "   -----------Species-----------",)
TagSelect SpeciesListWithFlow
StrArray  SpeciesFlowList
integer   speciesCount@,  HasFlowCount, speciesWithFlowCount@, i, j
Checkbox  CriteriaOK
string    Criteria, SpeciesName
; The follow watch function is used to set the species list display length.  User can adjust the value as needed.
Watch SpeciesFlowList[All,100]@

Sub InitialisePreStart()
["PlantModel.PGM_ExecuteTimeout (s)"] = PGM_time_out
EndSub

Sub CheckSpecies()
While i < speciesCount
SpeciesName = SDB.SpSymbol(i)
Criteria = Concatenate("[UnitGroup]=='Stream' AND [Qo.QM.", SpeciesName, " (g/h)]>1 ")
CriteriaOK = SpeciesListWithFlow.Exec(Criteria, false, false)
HasFlowCount= SpeciesListWithFlow.GetLen()
If HasFlowCount > 0
SpeciesFlowList.SetAt(j,SpeciesName)
j = j + 1
Endif
i = i + 1
EndWhile
speciesWithFlowCount = j
EndSub

Sub TerminateSolution()
speciesCount = SDB.SpeciesCount()
SpeciesFlowList.SetLen(speciesCount)
i = 0
j = 0
CheckSpecies()
Lognote("Finished Species Check")
EndSub



# Example 3 - Comparing Lists

The following PGM can be used to check if a certain species is used (has flow) or not used (with no flow) by the project:

• The PGM will search through each species in the project, if the species has flow it will be added to the "Species_With_Flow" list.
• The "Species With Flow" list is then compared to the full species list, thus creating a "Species No Flow" list by difference.
• The "Species With Flow" list can be used to create stream reports, as it will help shorten the list of species.
• See General Notes
PageLabel("CheckSpecies")
TextLabel(, "  --Time out value may need to be adjusted for large projects--" )
Real  PGM_time_out*("Time", "s")<<300>>
TextLabel(, "   -----------Species-----------",)
TagSelect SpeciesListWithFlow
StrArray  SpeciesFlowList,SpeciesNoFlowList
integer   speciesCount@,  HasFlowCount, speciesWithFlowCount@,  speciesNoFlowCount@, i, j, k
Checkbox  CriteriaOK
string    Criteria, SpeciesName
; The follow watch function is used to set the species list display length.  User can adjust the value as needed.
Watch SpeciesFlowList[All,100]@, SpeciesNoFlowList[All,100]@

Sub InitialisePreStart()
["PlantModel.PGM_ExecuteTimeout (s)"] = PGM_time_out
EndSub

Sub CheckSpecies()
While i < speciesCount
SpeciesName = SDB.SpSymbol(i)
Criteria = Concatenate("[UnitGroup]=='Stream' AND [Qo.QM.", SpeciesName, " (g/h)]>1 ")
CriteriaOK = SpeciesListWithFlow.Exec(Criteria, false, false)
HasFlowCount= SpeciesListWithFlow.GetLen()
If HasFlowCount > 0
SpeciesFlowList.SetAt(j,SpeciesName)
j = j + 1
Endif
i = i + 1
EndWhile
speciesWithFlowCount = j
EndSub

Sub NoFlowList()
While i < speciesCount
SpeciesName = SDB.SpSymbol(i)
if (StrCmp(SpeciesName,SpeciesFlowList.GetAt(j)) == 0)
; species has flow, check next species
j = j + 1
else
; species has no flow, add to no flow list
SpeciesNoFlowList.SetAt(k,SpeciesName)
k = k + 1
endif
i = i + 1
EndWhile
EndSub

Sub TerminateSolution()
speciesCount = SDB.SpeciesCount()
SpeciesFlowList.SetLen(speciesCount)
i = 0
j = 0
CheckSpecies()
speciesNoFlowCount = speciesCount - speciesWithFlowCount
if speciesNoFlowCount > 0
SpeciesNoFlowList.SetLen(speciesNoFlowCount)
i = 0
j = 0
k = 0
NoFlowList()
endif
Lognote("Finished Species Check")
EndSub

\$ ; --- end of file ---