====== Minimizing Root Mean Squared Difference with 5 point bracketing (bi-section variant) ======
A typical calibration problem is to get the model results to track on something while tweaking a variable. The approach described here attempts to minimize the difference over time between the model variable and some given tracking variable.
Here is the code for the .t file for the feed back view. The example implementation was to change the unitTA variable such that the difference between the model calculated space conditioning energy use and the energy use left over from the Stats Can total energy use minus the non-space conditioning energy use is minimized.
Instructions on how to customize the file for your situation is right in the top of the file.
===== Example code - simple =====
! ** This is a generic bracketing feedback view that does a divide and conquer approach **
! ** REQUIREMENTS:**
! ** It requires a min and max starting value which bound the problem **
! ** ALGORITHM:**
! ** 1. It divides the solution space into 5 evaluation positions, runs the model at each place and **
! ** chooses the position that minimizes the root mean squared difference between the model estimate **
! ** and the target **
! ** 2. It then reduces the step size in half, chooses 5 more points centered on the best result from **
! ** the last evaluation and then runs the model (as needed) to get the result at these 5 new positions**
! ** 3. Repeats the process of finding the min of the 5 points and sets up 5 more points until **
! ** the step size as a ratio of the best guess is less than the feedback view tolerance **
! ** HOW TO CUSTOMIZE FOR YOUR PROBLEM **
! ** 1. Search through the file for BEGIN USER MUST ADJUST HERE and adjust the code for your variables
creview unitTA[cr][]
view EUSpCTotal[cr,rfts,th][]
view SCEULeftForSC[cr,rfts,th][]
boolean $continue
if $numScns == 0
say ("This view requires a starting scenario.")
listen (" enter to continue >> ",$continue)
quit (-1)
endif
! ** BEGIN USER MUST ADJUST HERE **
local modelEst[upperDim,otherDims] = EUSpCTotal[cr,rfts,th][1]
local target[upperDim,otherDims] = SCEULeftForSC[cr,rfts,th][1]
! sum up the "other dims"
local diff[upperDim] = sum (target[upperDim,otherDims] - modelEst[upperDim,otherDims]; dim1=resFuelTypeSim, dim2=time)
local outputVar[upperDim,auxDims] = copyshape (unitTA[cr][2])
! ** END USER MUST ADJUST HERE **
!integer $fbViewIteration readOnly
!integer $fbViewMaxIters readOnly
!real $fbViewTolerance readOnly
local tolerance[] = create (; data=$fbViewTolerance)
! Declare keep variables
keep xm[upperDim,xm]
keep currentGuess[upperDim,auxDims,xm]
keep currentMeshStep[upperDim,auxDims]
keep rmsq[upperDim,xm]
keep rmsqLastEval[upperDim,xm]
keep x_min[upperDim,auxDims]
keep x_max[upperDim,auxDims]
keep doEvaluation[]
keep lastGuessNumber[]
keep numEvalsCompleted[]
say ("")
say (" processing for iteration ",$fbViewIteration)
if ($fbViewIteration == 1)
! ** NOTE: If there is more than one upper dimension the following block of code must be adjusted accordingly ***
! Setup shapes and initialize keep variables
!set up the mesh points
xm[upperDim,xm] = cumsum (create (; dimFrom1=diff[upperDim], dim=SEQ;xm:1:5:1;xmStep, data=1); multiplyEntity=off)
!get initial guess from the backeting values which you must know
currentGuess[upperDim,auxDims,xm] = copyshape (outputVar[upperDim,auxDims] * xm[upperDim,xm])
currentMeshStep[upperDim,auxDims] = copyshape (sum (currentGuess[upperDim,auxDims,xm]))
local rm[upperDim,xm] = changeshape (copyshape (diff[upperDim]); addDim2From2=xm[upperDim,xm])
rmsq[upperDim,xm] = copyshape (rm[upperDim,xm] * rm[upperDim,xm])
! ** BEGIN USER MUST ADJUST HERE **
! The [1] object indices assume calibration; for simulation views increment accordingly
x_min[upperDim,auxDims] = copyshape (unitTA[cr][1])
x_min[upperDim,auxDims] = 0.000001
x_max[upperDim,auxDims] = copyshape (unitTA[cr][1])
x_max[upperDim,auxDims] = 0.000010
! ** END USER MUST ADJUST HERE **
say (" get initial 5 guesses and set independent variable to guess 1")
local currentGuessx[upperDim,auxDims,xm] = copyshape (currentGuess[upperDim,auxDims,xm])
currentGuessx[upperDim,auxDims,xm] = insert (x_min[upperDim,auxDims]; xm:1)
currentGuessx[upperDim,auxDims,xm] = insert (x_max[upperDim,auxDims]; xm:5)
currentGuess[upperDim,auxDims,xm] = linint (currentGuessx[upperDim,auxDims,xm])
!get initial mesh step
currentMeshStep[upperDim,auxDims] = x_max[upperDim,auxDims] - x_min[upperDim,auxDims] / 4
outputVar[upperDim,auxDims] = extract (currentGuess[upperDim,auxDims,xm]; xm:1, shrink=on)
lastGuessNumber[] = 1
doEvaluation[] = 0
numEvalsCompleted[] = 0
skipto lastStepQuit1
endif
if ($fbViewIteration > 1)
integer $lastGuessNumber
getobjinfo (lastGuessNumber[], $lastGuessNumber; info=dataElement)
say (" get function for guess position ", $lastGuessNumber)
rmsq[upperDim,xm] = insert (diff[upperDim] * diff[upperDim]; xm:$lastGuessNumber)
! display (rmsq[upperDim,xm]) !helpful if debugging
endif
if ($fbViewIteration > 1) and ($fbViewIteration <= 5)
say (" set independent variable to guess ",$fbViewIteration)
outputVar[upperDim,auxDims] = extract (currentGuess[upperDim,auxDims,xm]; xm:$fbViewIteration, shrink=on)
lastGuessNumber[] = $fbViewIteration
if ($fbViewIteration==5)
doEvaluation[] = 1
endif
skipto lastStepQuit1
endif
integer $doEvaluation
getobjinfo (doEvaluation[], $doEvaluation; info=dataElement)
if $doEvaluation == 1
say (" processing for iteration ",$fbViewIteration)
say (" **do an evaluation**")
!do evaluation here and get next guesses")
!get best guess
local minValue[upperDim], coordAtMin[upperDim,V], coordAtMin1[upperDim]
minValue[upperDim], coordAtMin[upperDim,V] = coordmin (rmsq[upperDim,xm]; numDims=1)
coordAtMin1[upperDim] = extract (coordAtMin[upperDim,V]; coord:+0, shrink=on)
local isThisCoordCurrentBestGuess[upperDim,xm], currentBestGuess[upperDim,auxDims], rmsq_atCurrentGuess[upperDim]
isThisCoordCurrentBestGuess[upperDim,xm] = booleq (xm[upperDim,xm], coordAtMin1[upperDim])
currentBestGuess[upperDim,auxDims] = sum (isThisCoordCurrentBestGuess[upperDim,xm] * currentGuess[upperDim,auxDims,xm]; dim=xm)
rmsq_atCurrentGuess[upperDim] = sum (isThisCoordCurrentBestGuess[upperDim,xm] * rmsq[upperDim,xm]; dim=xm)
!display (coordAtMin1[upperDim], minValue[upperDim]) !helpful when debugging
local numEvalsCompletedx[] = numEvalsCompleted[]
numEvalsCompleted[] = numEvalsCompletedx[] + 1
integer $numEvalsCompleted
getobjinfo (numEvalsCompleted[], $numEvalsCompleted; info=dataElement)
say (" number of evaluations completed ",$numEvalsCompleted)
if ($numEvalsCompleted > 1)
! Can look at last evaluations results compared to this one then store this one for future comparisons
! table (rmsqLastEval[upperDim,xm], rmsq[upperDim,xm])
endif
rmsqLastEval[upperDim,xm] = rmsq[upperDim,xm]
!check for stoping
local numberNotConverged[] = sum (boolgt (abs (2 * currentMeshStep[upperDim,auxDims] / currentBestGuess[upperDim,auxDims]), \
tolerance[]); dim=all)
integer $numberNotConverged
getobjinfo (numberNotConverged[], $numberNotConverged; info=dataElement, default=1)
if ($numberNotConverged == 0) or ($fbViewIteration == $fbViewMaxIters)
if ($numberNotConverged == 0)
say (" stopping by convergence at iteration ",$fbViewIteration )
endif
if ($fbViewIteration == $fbViewMaxIters)
say (" stopping by reaching maximum iterations ",$fbViewIteration )
say (" number not converged is ",$numberNotConverged)
endif
outputVar[upperDim,auxDims] = currentBestGuess[upperDim,auxDims]
skipto lastStepQuit0
else
say (" set new guesses for points 1 3 and 5")
local currentGuessx[upperDim,auxDims,xm] = copyshape (currentGuess[upperDim,auxDims,xm])
currentGuessx[upperDim,auxDims,xm] = insert (currentBestGuess[upperDim,auxDims]; xm:3)
currentGuessx[upperDim,auxDims,xm] = insert (max (currentBestGuess[upperDim,auxDims] - currentMeshStep[upperDim,auxDims], x_min[upperDim,auxDims]); xm:1)
currentGuessx[upperDim,auxDims,xm] = insert (min (currentBestGuess[upperDim,auxDims] + currentMeshStep[upperDim,auxDims], x_max[upperDim,auxDims]); xm:5)
currentGuess[upperDim,auxDims,xm] = linint (currentGuessx[upperDim,auxDims,xm])
local currentMeshStepx[upperDim,auxDims] = currentMeshStep[upperDim,auxDims] / 2
currentMeshStep[upperDim,auxDims] = currentMeshStepx[upperDim,auxDims]
!get new rmsq by putting the best guess in the middle, the guess one below as the new min, and
!the one above as the new max
local rmsqx[upperDim,xm] = copyshape (rmsq[upperDim,xm])
rmsqx[upperDim,xm] = insert (rmsq_atCurrentGuess[upperDim]; xm:3)
local isThisCoord[upperDim,xm], guess[upperDim,auxDims], rmsq_atGuess[upperDim]
isThisCoord[upperDim,xm] = booleq (max (coordAtMin1[upperDim] - 1, 1), xm[upperDim,xm])
guess[upperDim,auxDims] = sum (isThisCoord[upperDim,xm] * currentGuess[upperDim,auxDims,xm]; dim=xm)
rmsq_atGuess[upperDim] = sum (isThisCoord[upperDim,xm] * rmsq[upperDim,xm]; dim=xm)
rmsqx[upperDim,xm] = insert (rmsq_atGuess[upperDim]; xm:1)
isThisCoord[upperDim,xm] = booleq (min (coordAtMin1[upperDim] + 1, 5), xm[upperDim,xm])
guess[upperDim,auxDims] = sum (isThisCoord[upperDim,xm] * currentGuess[upperDim,auxDims,xm]; dim=xm)
rmsq_atGuess[upperDim] = sum (isThisCoord[upperDim,xm] * rmsq[upperDim,xm]; dim=xm)
rmsqx[upperDim,xm] = insert (rmsq_atGuess[upperDim]; xm:5)
rmsq[upperDim,xm] = rmsqx[upperDim,xm]
!this leaves only xm=2,4 to be calculated before getting next minimum
say (" set independent variable to guess 2")
outputVar[upperDim,auxDims] = extract (currentGuess[upperDim,auxDims,xm]; xm:2, shrink=on)
lastGuessNumber[] = 2
doEvaluation[] = 0
skipto lastStepQuit1
endif
else
if ($fbViewIteration == $fbViewMaxIters)
say (" stopping by reaching maximum iterations ",$fbViewIteration )
say (" **do a final evaluation**")
!do evaluation here and get next guesses")
!get best guess
local minValue[upperDim], coordAtMin[upperDim,V], coordAtMin1[upperDim]
minValue[upperDim], coordAtMin[upperDim,V] = coordmin (rmsq[upperDim,xm]; numDims=1)
coordAtMin1[upperDim] = extract (coordAtMin[upperDim,V]; coord:+0, shrink=on)
local isThisCoordCurrentBestGuess[upperDim,xm], currentBestGuess[upperDim,auxDims], rmsq_atCurrentGuess[upperDim]
isThisCoordCurrentBestGuess[upperDim,xm] = booleq (xm[upperDim,xm], coordAtMin1[upperDim])
currentBestGuess[upperDim,auxDims] = sum (isThisCoordCurrentBestGuess[upperDim,xm] * currentGuess[upperDim,auxDims,xm]; dim=xm)
outputVar[upperDim,auxDims] = currentBestGuess[upperDim,auxDims]
skipto lastStepQuit0
else
say (" set independent variable to guess 4")
outputVar[upperDim,auxDims] = extract (currentGuess[upperDim,auxDims,xm]; xm:4, shrink=on)
lastGuessNumber[] = 4
doEvaluation[] = 1
skipto lastStepQuit1
endif
endif
! ** BEGIN USER MUST ADJUST HERE **
lastStepQuit0:
unitTA[cr][2] = outputVar[upperDim,auxDims]
quit (0)
lastStepQuit1:
unitTA[cr][2] = outputVar[upperDim,auxDims]
quit (1)
! ** END USER MUST ADJUST HERE **
===== Example code for if you want several modes your view =====
creview themCondC[uss,usdt,rsta][]
creview useExoThemCond[][]
view themSurfAreaCond[uss,usdt,rsta][]
view detEUSpC[uss,usdt,usrft->usreud,th][]
view resEnrEndUseSEDSandRECSEst[uss,usrft->usreu,t19912008][]
boolean $continue
if $numScns == 0
say ("This view requires a starting scenario.")
listen (" enter to continue >> ",$continue)
quit (-1)
endif
keep mode[]
keep firstIterForCurMode[]
keep fbViewMaxItersCurMode[]
if ($fbViewIteration == 1)
mode[] = 1
firstIterForCurMode[] = 1
fbViewMaxItersCurMode[] = 40
endif
integer $mode
getobjinfo (mode[], $mode; info=dataElement)
integer $firstIterForCurMode
getobjinfo (firstIterForCurMode[], $firstIterForCurMode; info=dataElement)
integer $firstIterForCurModeP4
$firstIterForCurModeP4 = $firstIterForCurMode + 4
integer $fbViewMaxItersCurMode
getobjinfo (fbViewMaxItersCurMode[], $fbViewMaxItersCurMode; info=dataElement)
if (mode == 1)
! ** BEGIN USER MUST ADJUST HERE **
local modelEst[upperDim,otherDims] = sum (extract (mapcat (detEUSpC[uss,usdt,usrft->usreud,th][1]; \
dim=usrftCOusreud); \
USResEndUseDet:spaceHeating, time:$firstCompYr..$lastCompYr, shrink=on); \
dim=USDwellType)
local target[upperDim,otherDims] = extract (mapcat (resEnrEndUseSEDSandRECSEst[uss,usrft->usreu,t19912008][1]; \
dim=usrftCOusreu); \
USResEndUse:spaceHeating, shrink=on)
! sum up the "other dims"
local diff[upperDim] = sum (target[upperDim,otherDims] - modelEst[upperDim,otherDims]; dim1=USResFuelType, dim2=time)
local outputVar[upperDim,auxDims] = copyshape (themCondC[uss,usdt,rsta][2])
! ** END USER MUST ADJUST HERE **
!integer $fbViewIteration readOnly
!integer $fbViewMaxIters readOnly
!real $fbViewTolerance readOnly
local tolerance[] = create (; data=$fbViewTolerance)
! Declare keep variables
keep xm[upperDim,xm]
keep currentGuess[upperDim,auxDims,xm]
keep currentMeshStep[upperDim,auxDims]
keep rmsq[upperDim,xm]
keep rmsqLastEval[upperDim,xm]
keep x_min[upperDim,auxDims]
keep x_max[upperDim,auxDims]
keep doEvaluation[]
keep lastGuessNumber[]
keep numEvalsCompleted[]
say ("")
say (" processing for iteration ",$fbViewIteration)
if ($fbViewIteration == $firstIterForCurMode)
! Setup shapes and initialize keep variables
!set up the mesh points
xm[upperDim,xm] = cumsum (create (; dimFrom1=diff[upperDim], dim=SEQ;xm:1:5:1;xmStep, data=1); multiplyEntity=off)
!get initial guess from the backeting values which you must know
currentGuess[upperDim,auxDims,xm] = copyshape (outputVar[upperDim,auxDims] * xm[upperDim,xm])
currentMeshStep[upperDim,auxDims] = copyshape (sum (currentGuess[upperDim,auxDims,xm]))
local rm[upperDim,xm] = changeshape (copyshape (diff[upperDim]); addDim2From2=xm[upperDim,xm])
rmsq[upperDim,xm] = copyshape (rm[upperDim,xm] * rm[upperDim,xm])
! ** BEGIN USER MUST ADJUST HERE **
local HOURPerDay[] = create (; entity=HOUR/day, data=24)
x_min[upperDim,auxDims] = themSurfAreaCond[upperDim,auxDims][1] / HOURPerDay[] / 2
x_max[upperDim,auxDims] = themSurfAreaCond[upperDim,auxDims][1] / HOURPerDay[] * 5
! ** END USER MUST ADJUST HERE **
say (" get initial 5 guesses and set independent variable to guess 1")
local currentGuessx[upperDim,auxDims,xm] = copyshape (currentGuess[upperDim,auxDims,xm])
currentGuessx[upperDim,auxDims,xm] = insert (x_min[upperDim,auxDims]; xm:1)
currentGuessx[upperDim,auxDims,xm] = insert (x_max[upperDim,auxDims]; xm:5)
currentGuess[upperDim,auxDims,xm] = linint (currentGuessx[upperDim,auxDims,xm])
!get initial mesh step
currentMeshStep[upperDim,auxDims] = x_max[upperDim,auxDims] - x_min[upperDim,auxDims] / 4
outputVar[upperDim,auxDims] = extract (currentGuess[upperDim,auxDims,xm]; xm:1, shrink=on)
lastGuessNumber[] = 1
doEvaluation[] = 0
numEvalsCompleted[] = 0
skipto lastStepQuit1
endif
if ($fbViewIteration > $firstIterForCurMode)
integer $lastGuessNumber
getobjinfo (lastGuessNumber[], $lastGuessNumber; info=dataElement)
say (" get function for guess position ", $lastGuessNumber)
rmsq[upperDim,xm] = insert (diff[upperDim] * diff[upperDim]; xm:$lastGuessNumber)
endif
if ($fbViewIteration > $firstIterForCurMode) and ($fbViewIteration <= $firstIterForCurModeP4)
integer $iter = $fbViewIteration - $firstIterForCurMode + 1
say (" set independent variable to guess ",$iter)
outputVar[upperDim,auxDims] = extract (currentGuess[upperDim,auxDims,xm]; xm:$iter, shrink=on)
lastGuessNumber[] = $iter
if ($fbViewIteration == $firstIterForCurModeP4)
doEvaluation[] = 1
endif
skipto lastStepQuit1
endif
integer $doEvaluation
getobjinfo (doEvaluation[], $doEvaluation; info=dataElement)
if $doEvaluation == 1
say (" processing for iteration ",$fbViewIteration)
say (" **do an evaluation**")
!do evaluation here and get next guesses")
!get best guess
local minValue[upperDim], coordAtMin[upperDim,V], coordAtMin1[upperDim]
minValue[upperDim], coordAtMin[upperDim,V] = coordmin (rmsq[upperDim,xm]; numDims=1)
coordAtMin1[upperDim] = extract (coordAtMin[upperDim,V]; coord:+0, shrink=on)
local isThisCoordCurrentBestGuess[upperDim,xm], currentBestGuess[upperDim,auxDims], rmsq_atCurrentGuess[upperDim]
isThisCoordCurrentBestGuess[upperDim,xm] = booleq (xm[upperDim,xm], coordAtMin1[upperDim])
currentBestGuess[upperDim,auxDims] = sum (isThisCoordCurrentBestGuess[upperDim,xm] * currentGuess[upperDim,auxDims,xm]; dim=xm)
rmsq_atCurrentGuess[upperDim] = sum (isThisCoordCurrentBestGuess[upperDim,xm] * rmsq[upperDim,xm]; dim=xm)
local numEvalsCompletedx[] = numEvalsCompleted[]
numEvalsCompleted[] = numEvalsCompletedx[] + 1
integer $numEvalsCompleted
getobjinfo (numEvalsCompleted[], $numEvalsCompleted; info=dataElement)
say (" number of evaluations completed ",$fbViewIteration )
if ($numEvalsCompleted > 1)
! Can look at last evaluations results compared to this one then store this one for future comparisons
! table (rmsqLastEval[upperDim,xm], rmsq[upperDim,xm])
endif
rmsqLastEval[upperDim,xm] = rmsq[upperDim,xm]
!check for stoping
local numberNotConverged[] = sum (boolgt (abs (2 * currentMeshStep[upperDim,auxDims] / currentBestGuess[upperDim,auxDims]), tolerance[]))
integer $numberNotConverged
getobjinfo (numberNotConverged[], $numberNotConverged; info=dataElement, default=1)
if ($numberNotConverged == 0) or ($fbViewIteration == $fbViewMaxItersCurMode)
if ($numberNotConverged == 0)
say (" stopping by convergence at iteration ",$fbViewIteration )
endif
if ($fbViewIteration == $fbViewMaxIters)
say (" stopping by reaching maximum iterations ",$fbViewIteration )
say (" number not converged is ",$numberNotConverged)
endif
outputVar[upperDim,auxDims] = currentBestGuess[upperDim,auxDims]
skipto lastStepQuit0
else
say (" Num not converged: ", $numberNotConverged)
say (" set new guesses for points 1 3 and 5")
local currentGuessx[upperDim,auxDims,xm] = copyshape (currentGuess[upperDim,auxDims,xm])
currentGuessx[upperDim,auxDims,xm] = insert (currentBestGuess[upperDim,auxDims]; xm:3)
currentGuessx[upperDim,auxDims,xm] = insert (max (currentBestGuess[upperDim,auxDims] - currentMeshStep[upperDim,auxDims], x_min[upperDim,auxDims]); xm:1)
currentGuessx[upperDim,auxDims,xm] = insert (min (currentBestGuess[upperDim,auxDims] + currentMeshStep[upperDim,auxDims], x_max[upperDim,auxDims]); xm:5)
currentGuess[upperDim,auxDims,xm] = linint (currentGuessx[upperDim,auxDims,xm])
local currentMeshStepx[upperDim,auxDims] = currentMeshStep[upperDim,auxDims] / 2
currentMeshStep[upperDim,auxDims] = currentMeshStepx[upperDim,auxDims]
!get new rmsq by putting the best guess in the middle, the guess one below as the new min, and
!the one above as the new max
local rmsqx[upperDim,xm] = copyshape (rmsq[upperDim,xm])
rmsqx[upperDim,xm] = insert (rmsq_atCurrentGuess[upperDim]; xm:3)
local isThisCoord[upperDim,xm], guess[upperDim,auxDims], rmsq_atGuess[upperDim]
isThisCoord[upperDim,xm] = booleq (max (coordAtMin1[upperDim] - 1, 1), xm[upperDim,xm])
guess[upperDim,auxDims] = sum (isThisCoord[upperDim,xm] * currentGuess[upperDim,auxDims,xm]; dim=xm)
rmsq_atGuess[upperDim] = sum (isThisCoord[upperDim,xm] * rmsq[upperDim,xm]; dim=xm)
rmsqx[upperDim,xm] = insert (rmsq_atGuess[upperDim]; xm:1)
isThisCoord[upperDim,xm] = booleq (min (coordAtMin1[upperDim] + 1, 5), xm[upperDim,xm])
guess[upperDim,auxDims] = sum (isThisCoord[upperDim,xm] * currentGuess[upperDim,auxDims,xm]; dim=xm)
rmsq_atGuess[upperDim] = sum (isThisCoord[upperDim,xm] * rmsq[upperDim,xm]; dim=xm)
rmsqx[upperDim,xm] = insert (rmsq_atGuess[upperDim]; xm:5)
rmsq[upperDim,xm] = rmsqx[upperDim,xm]
!this leaves only xm=2,4 to be calculated before getting next minimum
say (" set independent variable to guess 2")
outputVar[upperDim,auxDims] = extract (currentGuess[upperDim,auxDims,xm]; xm:2, shrink=on)
lastGuessNumber[] = 2
doEvaluation[] = 0
skipto lastStepQuit1
endif
else
say (" set independent variable to guess 4")
outputVar[upperDim,auxDims] = extract (currentGuess[upperDim,auxDims,xm]; xm:4, shrink=on)
lastGuessNumber[] = 4
doEvaluation[] = 1
skipto lastStepQuit1
endif
! ** BEGIN USER MUST ADJUST HERE **
lastStepQuit0:
themCondC[uss,usdt,rsta][2] = outputVar[upperDim,auxDims]
useExoThemCond[][2] = 1
!NOTE IF THERE IS ANOTHER MODE YOU WOULD WANT TO SWITHCH THE MODE HERE AND RESET THE FOLLOWING:
! mode[] = 2
! getobjinfo (mode[], $mode; info=dataElement)
! firstIterForCurMode[] = $fbViewIteration + 1
! getobjinfo (firstIterForCurMode[], $firstIterForCurMode; info=dataElement)
! $firstIterForCurModeP4 = $firstIterForCurMode + 4
! fbViewMaxItersCurMode[] = $fbViewIteration + 10
! getobjinfo (fbViewMaxItersCurMode[], $fbViewMaxItersCurMode; info=dataElement)
lastStepQuit1:
themCondC[uss,usdt,rsta][2] = outputVar[upperDim,auxDims]
useExoThemCond[][2] = 1
quit (1)
! ** END USER MUST ADJUST HERE **
endif !$mode == 1