This is an old revision of the document!
Define the target, define the model's result from the last iteration and move the leaver by that deviation ratio and try again.
Here's a simple example which is not fully templated but is a good start
view simTotEU[rr,dts,rfts->reu,th][] view RESDTotEnrUseWAdj[rr,rfts,th][] ! variables to change creview bulbPerDwellExo[rr,dts,bt,th][] creview useExoBulbPerDwell[][] view bulbsPerDwell[rr,dts,bt,th][] creview minorApplPRExog[rr,dts,minat,th][] creview useExoMinApplPenRate[][] view minorApplPR[rr,dts,minat,th][] creview majorApplPenRateExo[rr,mac,th][] creview useExoMajApplPenRate[][] view majorApplPenRate[rr,mac,th][] integer $trackStartYr integer $trackEndYr getobjinfo (bulbPerDwellExo[rr,dts,bt,th][1], $trackStartYr; info=sequenceStart, dim=time) getobjinfo (bulbPerDwellExo[rr,dts,bt,th][1], $trackEndYr; info=sequenceEnd, dim=time) integer $lastScnYr getobjinfo (bulbPerDwellExo[rr,dts,bt,th][1], $lastScnYr; info=sequenceEnd, dim=time) keep varTarget[upperDims,time] say ("Iteration: ", $fbViewIteration) if ($fbViewIteration == 1) ! ** BEGIN USER MUST ADJUST HERE ** ! NOTE I did 2 extracts so that I didn't shrink time out in case there is only 1 tracking year varTarget[upperDims,time] = extract (extract (RESDTotEnrUseWAdj[rr,rfts,th]; \ resFuelTypeSim:electricity, shrink=on); \ time:$trackStartYr..$trackEndYr) ! **END endif ! ** BEGIN USER MUST ADJUST HERE ** local varResultLI[upperDims,tsTrack] = extract (extract (sum (simTotEU[rr,dts,rfts->reu,th]; \ dim1=rftsCOreu@resFuelTypeSim, dim2=dwellingTypeSim); \ resFuelTypeSim:electricity, shrink=on); \ time:$trackStartYr..$trackEndYr) ! **END local devRatio[tsTrack] = varTarget[tsTrack] - varResultLI[tsTrack] / varTarget[tsTrack] !table (devRatio[tsTrack], varTarget[tsTrack], varResultLI[tsTrack]; overlay=on) !display (devRatio[tsTrack]) ! ** BEGIN USER MUST ADJUST HERE ** ! NOTE sometimes it's different between the first and subsequent iterations local crevarResultLI_var1[upperDims,time] local crevarResultLI_var2[upperDims,time] local crevarResultLI_var3[upperDims,time] if ($fbViewIteration == 1) crevarResultLI_var1[upperDims,time] = bulbsPerDwell[rr,dts,bt,th][1] crevarResultLI_var2[upperDims,time] = minorApplPR[rr,dts,minat,th][1] crevarResultLI_var3[upperDims,time] = majorApplPenRate[rr,mac,th][1] else crevarResultLI_var1[upperDims,time] = bulbsPerDwell[rr,dts,bt,th][1] crevarResultLI_var2[upperDims,time] = minorApplPR[rr,dts,minat,th][1] crevarResultLI_var3[upperDims,time] = majorApplPenRate[rr,mac,th][1] endif ! **END local numNotConv[] = sum (boolgt (abs (devRatio[tsTrack]), $fbViewTolerance); dim=all) integer $numNotConv getobjinfo(numNotConv[], $numNotConv; info=dataElement) if ($numNotConv == 0) or ($fbViewIteration == $fbViewMaxIters) mumble (" numNotConv = ", $numNotConv, " at iteration ",$fbViewIteration, " stopping due to ") if ($numNotConv == 0) say ("convergence") else say ("maximum iterations") endif ! Set the outputs ! ** BEGIN USER MUST ADJUST HERE ** ! NOTE sometimes it's different between the first and subsequent iterations bulbPerDwellExo[rr,dts,bt,th][2] = crevarResultLI_var1[upperDims,time] useExoBulbPerDwell[][2] = 1 minorApplPRExog[rr,dts,minat,th][2] = crevarResultLI_var2[upperDims,time] useExoMinApplPenRate[][2] = 1 majorApplPenRateExo[rr,mac,th][2] = crevarResultLI_var3[upperDims,time] useExoMajApplPenRate[][2] = 1 ! **END quit(0) else say (" numNotConv = ", $numNotConv, " at iteration ",$fbViewIteration, " continuing") endif ! USER NOTE - this code implies a positive relationship between the variable you are changing and the result ! for example, move up the input variable and expect the output to also move up. local multiplier[ts] = extend (min (max (devRatio[tsTrack], -0.5), 0.5) + 1.0; dim=time, end=$lastScnYr) ! ** BEGIN USER MUST ADJUST HERE ** ! NOTE sometimes it's different between the first and subsequent iterations bulbPerDwellExo[rr,dts,bt,th][2] = crevarResultLI_var1[upperDims,time] * multiplier[ts] useExoBulbPerDwell[][2] = 1 minorApplPRExog[rr,dts,minat,th][2] = crevarResultLI_var2[upperDims,time] * multiplier[ts] useExoMinApplPenRate[][2] = 1 majorApplPenRateExo[rr,mac,th][2] = crevarResultLI_var3[upperDims,time] * multiplier[ts] useExoMajApplPenRate[][2] = 1 ! **END quit(1)