Table lookup using Array and Matrix
Jump to navigation
Jump to search
Navigation: PGMs ➔ Example PGM Files ➔ Lookup Value
| Simple Examples | Subroutines Examples | Dynamic Examples | Steady State Overall Mass Balance | Array and Matrix Examples | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Basic Layout | Simple Calculations | Initialise PreStart | Multi-Step Trigger | Checking Project | Counter, While and Random | Belt Filter Wash Loss | Startup Actions | Mass Balance | Mass Balance | Species Balance | Elemental Balance | Lookup Value | Set Values | Tridiagonal System |
Related Links: PGM Files using Class and Functions, Matrix Class, Array Class
PGM FILE - Lookup Gypsum Solubility from a Table
This example shows how to look up the Gypsum solubility from a table based on temperature and acid concentration.
Note: This example data is for PGM demonstration purposes only, please use with caution.
Gypsum Solubility (g/L) Temperature (C) Acid Conc (g/L) 25 30 35 0 2.12 2.11 2.10 9.8 1.77 1.82 1.88
If we have a solution at 28°C, and acid concentration at 5 g/L, we want to look up the gypsum solubility from the above table.
- The above table only gives temperature range in 5°C increments, so we will use the 30°C column. At 30°C, we have values for gypsum solubility for acid concentration of 0 g/L and 9.8 g/L. We will use linear interpolation to obtain the solubility value at acid concentration at 5 g/L.
- The result is therefore 2.11 + (1.82 - 2.11) * (5 - 0)/(9.8-0) = 1.96 g/L
We can define the table values directly in the PGM file, then look up the values based on the current conditions:
- Create two Arrays with constant values, to represent row heading (acid concentration) and column heading (temperature segments).
- Create a Matrix with constant values to represent the Gypsum solubility values.
- Match the current/required temperature to the nearest temperature segment
- Match the current/required acid concentration to obtain the gypsum solubility values from the table.
- Perform linear interpolation to obtain the gypsum solubility.
An example PGM file that does the above is given below. Note the use of the 'Watch' keywords to display the Matrix values in the Access Window.
;--- SysCAD General Controller (PGM) file ---
; Revision: 2 Date: Jan 2023 Author: SysCAD Team
;--- variable declarations ---
REAL CurrentTemp@("T", "C"), TemperatureSegment@("T", "C")
REAL CurrentAcidConc@("Conc", "g/L"), AcidConcPt1@("Conc", "g/L"), AcidConcPt2@("Conc", "g/L")
REAL GypsumSol@("Conc", "g/L"), GypsumSolPt1@("Conc", "g/L"), GypsumSolPt2@("Conc", "g/L")
const Array Temperature = {25, 30, 35}
const Array AcidConc = {0, 9.8}
const matrix GypsumSolubility = { {2.12, 2.11, 2.10}, {1.77, 1.82, 1.88} }
;Array Temperature = {25, 30, 35} ;Old syntax before Build 139.32325
;Array AcidConc = {0, 9.8} ;Old syntax before Build 139.32325
;matrix GypsumSolubility = { {2.12, 2.11, 2.10}, {1.77, 1.82, 1.88} } ;Old syntax before Build 139.32325
Watch GypsumSolubility@
LONG RowCount@, ColCount@, TemperatureIndex@, AcidIndex@
BYTE i, j
REAL modTemp, temp, temp1
Sub InitialiseSolution()
RowCount = GypsumSolubility.GetRowCount()
ColCount = GypsumSolubility.GetColCount()
endSub
; Get the current temperature and round it to the closest value of multiple 5
CurrentTemp = ["P_003.To (C)"]
modTemp = MOD(CurrentTemp, 5)
TemperatureSegment= IIF(modTemp>=2.500001, ROUND(CurrentTemp+(5-modTemp)), ROUND(CurrentTemp-modTemp))
;limits the temperature to the maximum T defined in the array
TemperatureSegment= MIN(Temperature[ColCount-1], TemperatureSegment)
;Match the current temperature to the temperature index number (column number)
i = 0
While i < ColCount
temp = Temperature[i]
If temp == TemperatureSegment
TemperatureIndex = i
i=ColCount
endif
i = i + 1
Endwhile
;Match the current acid concentration to the acid index number (row number)
CurrentAcidConc = ["P_003.Qo.CMC:LPh.H2SO4 (g/L)"]
j = 0
While j < RowCount
temp1 = AcidConc[j]
If temp1 >= CurrentAcidConc
AcidIndex = j
j=RowCount
endif
j = j + 1
Endwhile
;Get Gypsum Solubility using the Temperature and acid Index, and apply interpolation
GypsumSolPt1 = GypsumSolubility.GetAt(AcidIndex-1, TemperatureIndex)
GypsumSolPt2 = GypsumSolubility.GetAt(AcidIndex, TemperatureIndex)
AcidConcPt1 = AcidConc[AcidIndex-1]
AcidConcPt2 = AcidConc[AcidIndex]
GypsumSol = GypsumSolPt1 + (GypsumSolPt2 - GypsumSolPt1) * ((CurrentAcidConc - AcidConcPt1)/(AcidConcPt2-AcidConcPt1))
$ ; --- end of file ---
