' '---------------------------- '--- Creation information --- '---------------------------- ' 'Name: balance.ave 'Version: 1.0 'Date: 01/11/97 'Author: Ferdi Hellweger ' Center for Research in Water Resources ' The University of Texas at Austin ' ferdi@crwr.utexas.edu ' '--------------------------- '--- Purpose/Description --- '--------------------------- ' 'This program computes the constituent mass balance. ' '--------------------------------------------- '--- Check if units configuration happened --- '--------------------------------------------- ' if (not _configu) then configure = msgbox.yesno("Units are not configured. Configure it now?","BALANCE",true) if (configure) then av.run("balconu", nil) else exit end end ' '---------------- '--- Get view --- '---------------- ' theview = av.getactivedoc ' '------------------ '--- Get themes --- '------------------ ' theactivethemes = theview.getactivethemes if (theactivethemes.count = 0) then msgbox.error("No active themes found", "BALANCE") exit end if (theactivethemes.count = 1) then msgbox.error("Only one active theme found", "BALANCE") exit end if (theactivethemes.count > 2) then msgbox.error("Too many active themes found", "BALANCE") exit end if (theactivethemes.count = 2) then lfound = false pfound = false for each activetheme in theactivethemes theftab = activetheme.getftab theshapef = theftab.findfield("shape") theshape = theftab.returnvalue(theshapef,0) if (theshape.getclass.getclassname = "polyline") then theltheme = activetheme lfound = true end if (theshape.getclass.getclassname = "polygon") then theptheme = activetheme pfound = true end end end if (not lfound) then msgbox.error("One theme needs to be a line theme", "BALANCE") exit end if (not pfound) then msgbox.error("One theme needs to be a polygon theme", "BALANCE") exit end ' '--------------------- '--- Set up themes --- '--------------------- ' 'line theme ' lftab = theltheme.getftab if (lftab = nil) then msgbox.error("Can't open line theme","BALANCE") exit end ' lshapef = lftab.findfield("shape") if (lshapef = nil) then msgbox.error("Can't find 'shape' field in line theme","BALANCE") exit end ' lpf = lftab.findfield("lpoly#") if (lpf = nil) then lpf = lftab.findfield("lpoly_") end if (lpf = nil) then msgbox.error("Can't find 'lpoly#' field in line theme","BALANCE") exit end ' rpf = lftab.findfield("rpoly#") if (rpf = nil) then rpf = lftab.findfield("rpoly_") end if (rpf = nil) then msgbox.error("Can't find 'rpoly#' field in line theme","BALANCE") exit end ' qf = lftab.findfield("q") if (qf = nil) then addfield = msgbox.yesno("Can't find 'q' field in line theme. Add it?","BALANCE", true) if (addfield) then lftab.seteditable(true) qf = field.make("q", #FIELD_DECIMAL, 16, 4) lftab.addfields({qf}) lftab.seteditable(false) else exit end end ' epf = lftab.findfield("ep") if (epf = nil) then addfield = msgbox.yesno("Can't find 'ep' field in line theme. Add it?","BALANCE", true) if (addfield) then lftab.seteditable(true) epf = field.make("ep", #FIELD_DECIMAL, 16, 4) lftab.addfields({epf}) lftab.seteditable(false) else exit end end ' sbf = lftab.findfield("sb") if (sbf = nil) then addfield = msgbox.yesno("Can't find 'sb' field in line theme. Add it?","BALANCE", true) if (addfield) then lftab.seteditable(true) sbf = field.make("sb", #FIELD_DECIMAL, 16, 4) lftab.addfields({sbf}) lftab.seteditable(false) else exit end end ' fadf = lftab.findfield("fad") if (fadf = nil) then addfield = msgbox.yesno("Can't find 'fad' field in line theme. Add it?","BALANCE", true) if (addfield) then lftab.seteditable(true) fadf = field.make("fad", #FIELD_DECIMAL, 16, 4) lftab.addfields({fadf}) lftab.seteditable(false) else exit end end ' fdif = lftab.findfield("fdi") if (fdif = nil) then addfield = msgbox.yesno("Can't find 'fdi' field in line theme. Add it?","BALANCE", true) if (addfield) then lftab.seteditable(true) fdif = field.make("fdi", #FIELD_DECIMAL, 16, 4) lftab.addfields({fdif}) lftab.seteditable(false) else exit end end ' 'polygon theme ' pftab = theptheme.getftab if (pftab = nil) then msgbox.error("Can't open polygon theme","BALANCE") exit end ' pshapef = pftab.findfield("shape") if (pshapef = nil) then msgbox.error("Can't find 'shape' field in polygon theme","BALANCE") exit end ' if (theptheme.getsrcname.asstring.right(4) = ".shp") then pname = theptheme.getsrcname.asstring.astokens(".").get(0)+"#" polyf = pftab.findfield(pname) end if (polyf = nil) then pname = theptheme.getsrcname.asstring.astokens(".").get(0)+"_" polyf = pftab.findfield(pname) end if (polyf = nil) then pname = theptheme.getsrcname.asstring+"#" polyf = pftab.findfield(pname) end if (polyf = nil) then pname = theptheme.getsrcname.asstring+"_" polyf = pftab.findfield(pname) end if (polyf = nil) then msgbox.error("Can't find polygon number field in polygon theme","BALANCE") exit end ' sof = pftab.findfield("so") if (sof = nil) then addfield = msgbox.yesno("Can't find 'so' field in polygon theme. Add it?","BALANCE", true) if (addfield) then pftab.seteditable(true) sof = field.make("so", #FIELD_DECIMAL, 16, 4) pftab.addfields({sof}) pftab.seteditable(false) else exit end end ' wnpf = pftab.findfield("wnp") if (wnpf = nil) then addfield = msgbox.yesno("Can't find 'wnp' field in polygon theme. Add it?","BALANCE", true) if (addfield) then pftab.seteditable(true) wnpf = field.make("wnp", #FIELD_DECIMAL, 16, 4) pftab.addfields({wnpf}) pftab.seteditable(false) else exit end end ' watf = pftab.findfield("wat") if (watf = nil) then addfield = msgbox.yesno("Can't find 'wat' field in polygon theme. Add it?","BALANCE", true) if (addfield) then pftab.seteditable(true) watf = field.make("wat", #FIELD_DECIMAL, 16, 4) pftab.addfields({watf}) pftab.seteditable(false) else exit end end ' wotf = pftab.findfield("wot") if (wotf = nil) then addfield = msgbox.yesno("Can't find 'wot' field in polygon theme. Add it?","BALANCE", true) if (addfield) then pftab.seteditable(true) wotf = field.make("wot", #FIELD_DECIMAL, 16, 4) pftab.addfields({wotf}) pftab.seteditable(false) else exit end end ' wsef = pftab.findfield("wse") if (wsef = nil) then addfield = msgbox.yesno("Can't find 'wse' field in polygon theme. Add it?","BALANCE", true) if (addfield) then pftab.seteditable(true) wsef = field.make("wse", #FIELD_DECIMAL, 16, 4) pftab.addfields({wsef}) pftab.seteditable(false) else exit end end ' kf = pftab.findfield("k") if (kf = nil) then addfield = msgbox.yesno("Can't find 'k' field in polygon theme. Add it?","BALANCE", true) if (addfield) then pftab.seteditable(true) kf = field.make("k", #FIELD_DECIMAL, 16, 4) pftab.addfields({kf}) pftab.seteditable(false) else exit end end ' vf = pftab.findfield("v") if (vf = nil) then addfield = msgbox.yesno("Can't find 'v' field in polygon theme. Add it?","BALANCE", true) if (addfield) then pftab.seteditable(true) vf = field.make("v", #FIELD_DECIMAL, 16, 4) pftab.addfields({vf}) pftab.seteditable(false) else exit end end ' sf = pftab.findfield("s") if (sf = nil) then addfield = msgbox.yesno("Can't find 's' field in polygon theme. Add it?","BALANCE", true) if (addfield) then pftab.seteditable(true) sf = field.make("s", #FIELD_DECIMAL, 16, 4) pftab.addfields({sf}) pftab.seteditable(false) else exit end end ' wadf = pftab.findfield("wad") if (wadf = nil) then addfield = msgbox.yesno("Can't find 'wad' field in polygon theme. Add it?","BALANCE", true) if (addfield) then pftab.seteditable(true) wadf = field.make("wad", #FIELD_DECIMAL, 16, 4) pftab.addfields({wadf}) pftab.seteditable(false) else exit end end ' wdif = pftab.findfield("wdi") if (wdif = nil) then addfield = msgbox.yesno("Can't find 'wdi' field in polygon theme. Add it?","BALANCE", true) if (addfield) then pftab.seteditable(true) wdif = field.make("wdi", #FIELD_DECIMAL, 16, 4) pftab.addfields({wdif}) pftab.seteditable(false) else exit end end ' wdf = pftab.findfield("wd") if (wdf = nil) then addfield = msgbox.yesno("Can't find 'wd' field in polygon theme. Add it?","BALANCE", true) if (addfield) then pftab.seteditable(true) wdf = field.make("wd", #FIELD_DECIMAL, 16, 4) pftab.addfields({wdf}) pftab.seteditable(false) else exit end end ' '---------------------------------- '--- Set up plot parameter list --- '---------------------------------- ' plotlist = list.make plotlist = plotlist.add(theview) plotlist = plotlist.add(theltheme) plotlist = plotlist.add(theptheme) plotlist = plotlist.add(lftab) plotlist = plotlist.add(pftab) plotlist = plotlist.add(lshapef) plotlist = plotlist.add(qf) plotlist = plotlist.add(fadf) plotlist = plotlist.add(fdif) plotlist = plotlist.add(pshapef) plotlist = plotlist.add(wnpf) plotlist = plotlist.add(watf) plotlist = plotlist.add(wotf) plotlist = plotlist.add(wsef) plotlist = plotlist.add(wadf) plotlist = plotlist.add(wdif) plotlist = plotlist.add(wdf) ' '---------------------------------- '--- Get run control parameters --- '---------------------------------- ' labels = list.make labels = labels.add("Delta t " + _tlab) labels = labels.add("Converge delta s " + _slab) labels = labels.add("Diverge delta s " + _slab) labels = labels.add("Max t " + _tlab) labels = labels.add("User Observation Level (0-4)") ' defaults = list.make defaults = defaults.add((_deltat * _tout).asstring) defaults = defaults.add(_convs.asstring) defaults = defaults.add(_divs.asstring) defaults = defaults.add((_maxt * _tout).asstring) defaults = defaults.add(_oblevel.asstring) ' inputs = msgbox.multiinput("Enter run control parameters", "BALANCE", labels, defaults) if (inputs.count = 0) then exit end ' _deltat = inputs.get(0).asnumber * _tin _convs = inputs.get(1).asnumber _divs = inputs.get(2).asnumber _maxt = inputs.get(3).asnumber * _tin _oblevel = inputs.get(4).asnumber ' '----------------- '--- Calculate --- '----------------- ' '--- Initial set up --- ' 'make attribute tables editable ' lftab.seteditable(true) pftab.seteditable(true) ' 'set initial variables ' time = 0 maxdeltas = 0 converged = false diverged = false ' 'set starting concentrations to initial concentrations 'rezero advective and diffusive loads 'make index for polygon attribute table ' polydict = dictionary.make(pftab.getnumrecords * 2) for each prec in pftab so = pftab.returnvalue(sof, prec) pftab.setvalue(sf, prec, so) ' pftab.setvalue(wadf, prec, 0) pftab.setvalue(wdif, prec, 0) ' poly = pftab.returnvalue(polyf, prec) polydict.add(poly, prec.asstring.asnumber) end ' 'dictionaries for speed processing ' if (_oblevel <= 1) then ' pftabdict = dictionary.make(pftab.getnumrecords * 15) for each prec in pftab ' poly = pftab.returnvalue(polyf, prec).clone ' pdrec = list.make pdrec = pdrec.add(pftab.returnvalue(sof, prec).clone) pdrec = pdrec.add(pftab.returnvalue(wnpf, prec).clone) pdrec = pdrec.add(pftab.returnvalue(watf, prec).clone) pdrec = pdrec.add(pftab.returnvalue(wotf, prec).clone) pdrec = pdrec.add(pftab.returnvalue(wsef, prec).clone) pdrec = pdrec.add(pftab.returnvalue(kf, prec).clone) pdrec = pdrec.add(pftab.returnvalue(vf, prec).clone) pdrec = pdrec.add(pftab.returnvalue(sf, prec).clone) pdrec = pdrec.add(pftab.returnvalue(wadf, prec).clone) pdrec = pdrec.add(pftab.returnvalue(wdif, prec).clone) pdrec = pdrec.add(pftab.returnvalue(wdf, prec).clone) pdrec = pdrec.add(prec.clone) ' pftabdict.add(poly, pdrec.clone) end ' lftablist = list.make for each lrec in lftab ' llrec = list.make llrec = llrec.add(lftab.returnvalue(lpf, lrec).clone) llrec = llrec.add(lftab.returnvalue(rpf, lrec).clone) llrec = llrec.add(lftab.returnvalue(qf, lrec).clone) llrec = llrec.add(lftab.returnvalue(epf, lrec).clone) llrec = llrec.add(lftab.returnvalue(sbf, lrec).clone) llrec = llrec.add(lftab.returnvalue(fadf, lrec).clone) llrec = llrec.add(lftab.returnvalue(fdif, lrec).clone) llrec = llrec.add(lrec.clone) ' lftablist.add(llrec.clone) end ' end ' 'user observation ' if (_oblevel >= 1) then av.setstatus(0) av.showstopbutton end if (_oblevel >= 2) then thedisplay = theview.getdisplay end ' '--- Time step loop --- ' 'regular processing ' if (_oblevel > 1) then while ((not converged) and (not diverged) and (time < _maxt)) ' 'increment time ' time = time + _deltat ' 'user observation ' message = "BALANCE Time: " + (time * _tout).asstring + " " + _tlab +" Max Delta S: " + maxdeltas.asstring + " " + _slab av.showmsg(message) running = av.setstatus(((time / _maxt) * 100)) if (not running) then message = "Time: "+(time * _tout).asstring + " " + _tlab message = message + nl + "Maximum delta s: " + maxdeltas.asstring + " " + _slab message = message + nl + "BALANCE stopped by user." msgbox.info(message,"BALANCE") av.showmsg("") av.setstatus(100) lftab.seteditable(false) pftab.seteditable(false) exit end ' '--- Exchanges --- ' 'rezero ' for each prec in pftab pftab.setvalue(wadf, prec, 0) pftab.setvalue(wdif, prec, 0) end ' for each lrec in lftab ' 'get line attributes ' lp = lftab.returnvalue(lpf, lrec) rp = lftab.returnvalue(rpf, lrec) q = lftab.returnvalue(qf, lrec) ep = lftab.returnvalue(epf, lrec) sb = lftab.returnvalue(sbf, lrec) * _sin ' 'find adjacent concentrations ' sl = 0 sr = 0 if (lp > 1) then sl = pftab.returnvalue(sf, polydict.get(lp)) end if (rp > 1) then sr = pftab.returnvalue(sf, polydict.get(rp)) end ' 'calculate advection ' lftab.setvalue(fadf, lrec, 0) if ((q > 0) and (lp > 1) and (rp > 1)) then lftab.setvalue(fadf, lrec, ((sl * q) * _wout)) wadold = pftab.returnvalue(wadf, polydict.get(lp)) * _win wad = wadold - (sl * q) pftab.setvalue(wadf, polydict.get(lp), wad * _wout) wadold = pftab.returnvalue(wadf, polydict.get(rp)) * _win wad = wadold + (sl * q) pftab.setvalue(wadf, polydict.get(rp), wad * _wout) end if ((q < 0) and (lp > 1) and (rp > 1)) then lftab.setvalue(fadf, lrec, ((sr * q) * _wout)) wadold = pftab.returnvalue(wadf, polydict.get(rp)) * _win wad = wadold + (sr * q) pftab.setvalue(wadf, polydict.get(rp), wad * _wout) wadold = pftab.returnvalue(wadf, polydict.get(lp)) * _win wad = wadold - (sr * q) pftab.setvalue(wadf, polydict.get(lp), wad * _wout) end if ((q > 0) and (lp = 1)) then lftab.setvalue(fadf, lrec, ((sb * q) * _wout)) wadold = pftab.returnvalue(wadf, polydict.get(rp)) * _win wad = wadold + (sb * q) pftab.setvalue(wadf, polydict.get(rp), wad * _wout) end if ((q > 0) and (rp = 1)) then lftab.setvalue(fadf, lrec, ((sl * q) * _wout)) wadold = pftab.returnvalue(wadf, polydict.get(lp)) * _win wad = wadold - (sl * q) pftab.setvalue(wadf, polydict.get(lp), wad * _wout) end if ((q < 0) and (lp = 1)) then lftab.setvalue(fadf, lrec, ((sr * q) * _wout)) wadold = pftab.returnvalue(wadf, polydict.get(rp)) * _win wad = wadold + (sr * q) pftab.setvalue(wadf, polydict.get(rp), wad * _wout) end if ((q < 0) and (rp = 1)) then lftab.setvalue(fadf, lrec, ((sb * q) * _wout)) wadold = pftab.returnvalue(wadf, polydict.get(lp)) * _win wad = wadold - (sb * q) pftab.setvalue(wadf, polydict.get(lp), wad * _wout) end ' 'calculate diffusion ' lftab.setvalue(fdif, lrec, 0) if ((lp > 1) and (rp > 1)) then lftab.setvalue(fdif, lrec, (ep * (sl - sr) * _wout)) wdiold = pftab.returnvalue(wdif, polydict.get(lp)) * _win wdi = wdiold - (ep * (sl - sr)) pftab.setvalue(wdif, polydict.get(lp), wdi * _wout) wdiold = pftab.returnvalue(wdif, polydict.get(rp)) * _win wdi = wdiold + (ep * (sl - sr)) pftab.setvalue(wdif, polydict.get(rp), wdi * _wout) end if ((rp = 1) and (ep > 0)) then lftab.setvalue(fdif, lrec, (ep * (sl - sb) * _wout)) wdiold = pftab.returnvalue(wdif, polydict.get(lp)) * _win wdi = wdiold - (ep * (sl - sb)) pftab.setvalue(wdif, polydict.get(lp), wdi * _wout) end if ((lp = 1) and (ep > 0)) then lftab.setvalue(fdif, lrec, (ep * (sb - sr) * _wout)) wdiold = pftab.returnvalue(wdif, polydict.get(rp)) * _win wdi = wdiold + (ep * (sb - sr)) pftab.setvalue(wdif, polydict.get(rp), wdi * _wout) end end ' '--- Polygons --- ' maxdeltas = 0 ' for each prec in pftab ' wnp = pftab.returnvalue(wnpf, prec) * _win so = pftab.returnvalue(sof, prec) * _sin wat = pftab.returnvalue(watf, prec) * _win wot = pftab.returnvalue(wotf, prec) * _win wse = pftab.returnvalue(wsef, prec) * _win k = pftab.returnvalue(kf, prec) * _kin v = pftab.returnvalue(vf, prec) sold = pftab.returnvalue(sf, prec) * _sin wad = pftab.returnvalue(wadf, prec) * _win wdi = pftab.returnvalue(wdif, prec) * _win ' wt = wnp + wat + wot + wse - (k * v * sold) + wad + wdi snew = sold + (wt * (_deltat / v)) pftab.setvalue(sf, prec, snew * _sout) ' pftab.setvalue(wdf, prec, (k * v * sold) * _wout) ' thisdeltas = (snew - sold).abs if (thisdeltas > maxdeltas) then maxdeltas = thisdeltas end end ' if ((maxdeltas > 0) and (maxdeltas <= _convs)) then converged = true end if (maxdeltas >= _divs) then diverged = true end if (_oblevel >=3) then av.run("balplot",plotlist) end if (_oblevel >= 2) then theltheme.updatelegend theptheme.updatelegend theview.draw(thedisplay) end if (_oblevel >= 4) then message = "Time: "+(time * _tout).asstring+" "+_tlab+nl+"Maximum delta s: "+maxdeltas.asstring+ " "+_slab+nl+"User Observation Level:" default = _oblevel.asstring newoblevel = msgbox.input(message, "BALANCE", default) if (newoblevel = nil) then av.showmsg("") av.setstatus(100) lftab.seteditable(false) pftab.seteditable(false) exit end _oblevel = newoblevel.asnumber end end end ' 'speed processing ' if (_oblevel <= 1) then while ((not converged) and (not diverged) and (time < _maxt)) ' 'increment time ' time = time + _deltat ' 'user observation ' message = "BALANCE Time: " + (time * _tout).asstring + " " + _tlab +" Max Delta S: " + maxdeltas.asstring + " " + _slab av.showmsg(message) running = av.setstatus(((time / _maxt) * 100)) if (not running) then message = "Time: "+(time * _tout).asstring + " " + _tlab message = message + nl + "Maximum delta s: " + maxdeltas.asstring + " " + _slab message = message + nl + "BALANCE stopped by user." msgbox.info(message,"BALANCE") av.showmsg("") av.setstatus(100) for each llrec in lftablist lftab.setvalue(fadf, llrec.get(7), llrec.get(5)) lftab.setvalue(fdif, llrec.get(7), llrec.get(6)) end for each pdrec in pftabdict pftab.setvalue(sf, pdrec.get(11), pdrec.get(7)) pftab.setvalue(wadf, pdrec.get(11), pdrec.get(8)) pftab.setvalue(wdif, pdrec.get(11), pdrec.get(9)) pftab.setvalue(wdf, pdrec.get(11), pdrec.get(10)) end lftab.seteditable(false) pftab.seteditable(false) exit end ' '--- Exchanges --- ' 'rezero ' for each pdrec in pftabdict pdrec.set(8, 0) pdrec.set(9, 0) end ' for each llrec in lftablist ' 'get line attributes ' lp = llrec.get(0) rp = llrec.get(1) q = llrec.get(2) ep = llrec.get(3) sb = llrec.get(4) * _sin ' 'find adjacent concentrations ' sl = 0 sr = 0 if (lp > 1) then sl = pftabdict.get(lp).get(7) end if (rp > 1) then sr = pftabdict.get(rp).get(7) end ' 'calculate advection ' llrec.set(5, 0) if ((q > 0) and (lp > 1) and (rp > 1)) then llrec.set(5,((sl * q) * _wout).clone) wadold = pftabdict.get(lp).get(8) * _win wad = wadold - (sl * q) pftabdict.get(lp).set(8, (wad * _wout).clone) wadold = pftabdict.get(rp).get(8) * _win wad = wadold + (sl * q) pftabdict.get(rp).set(8, (wad * _wout).clone) end if ((q < 0) and (lp > 1) and (rp > 1)) then llrec.set(5, ((sr * q) * _wout).clone) wadold = pftabdict.get(rp).get(8) * _win wad = wadold + (sr * q) pftabdict.get(rp).set(8, (wad * _wout).clone) wadold = pftabdict.get(lp).get(8) * _win wad = wadold - (sr * q) pftabdict.get(lp).set(8, (wad * _wout).clone) end if ((q > 0) and (lp = 1)) then llrec.set(5, ((sb * q) * _wout).clone) wadold = pftabdict.get(rp).get(8) * _win wad = wadold + (sb * q) pftabdict.get(rp).set(8, (wad * _wout).clone) end if ((q > 0) and (rp = 1)) then llrec.set(5, ((sl * q) * _wout).clone) wadold = pftabdict.get(lp).get(8) * _win wad = wadold - (sl * q) pftabdict.get(lp).set(8, (wad * _wout).clone) end if ((q < 0) and (lp = 1)) then llrec.set(5, ((sr * q) * _wout).clone) wadold = pftabdict.get(rp).get(8) * _win wad = wadold + (sr * q) pftabdict.get(rp).set(8, (wad * _wout).clone) end if ((q < 0) and (rp = 1)) then llrec.set(5, ((sb * q) * _wout).clone) wadold = pftabdict.get(lp).get(8) * _win wad = wadold - (sb * q) pftabdict.get(lp).set(8, (wad * _wout).clone) end ' 'calculate diffusion ' llrec.set(6, 0) if ((lp > 1) and (rp > 1)) then llrec.set(6, (ep * (sl - sr) * _wout).clone) wdiold = pftabdict.get(lp).get(9) * _win wdi = wdiold - (ep * (sl - sr)) pftabdict.get(lp).set(9, (wdi * _wout).clone) wdiold = pftabdict.get(rp).get(9) * _win wdi = wdiold + (ep * (sl - sr)) pftabdict.get(rp).set(9, (wdi * _wout).clone) end if ((rp = 1) and (ep > 0)) then llrec.set(6, (ep * (sl - sb) * _wout).clone) wdiold = pftabdict.get(lp).get(9) * _win wdi = wdiold - (ep * (sl - sb)) pftabdict.get(lp).set(9, (wdi * _wout).clone) end if ((lp = 1) and (ep > 0)) then llrec.set(6, (ep * (sb - sr) * _wout).clone) wdiold = pftabdict.get(rp).get(9) * _win wdi = wdiold + (ep * (sb - sr)) pftabdict.get(rp).set(9, (wdi * _wout).clone) end end ' '--- Polygons --- ' maxdeltas = 0 ' for each pdrec in pftabdict ' wnp = pdrec.get(1) * _win so = pdrec.get(0) * _sin wat = pdrec.get(2) * _win wot = pdrec.get(3) * _win wse = pdrec.get(4) * _win k = pdrec.get(5) * _kin v = pdrec.get(6) sold = pdrec.get(7) * _sin wad = pdrec.get(8) * _win wdi = pdrec.get(9) * _win ' wt = wnp + wat + wot + wse - (k * v * sold) + wad + wdi snew = sold + (wt * (_deltat / v)) pdrec.set(7, (snew * _sout).clone) ' pdrec.set(10, ((k * v * sold) * _wout).clone) ' thisdeltas = (snew - sold).abs if (thisdeltas > maxdeltas) then maxdeltas = thisdeltas end end ' if ((maxdeltas > 0) and (maxdeltas <= _convs)) then converged = true end if (maxdeltas >= _divs) then diverged = true end end end ' 'write data to attribute tables for speed processing ' if (_oblevel <= 1) then for each llrec in lftablist lftab.setvalue(fadf, llrec.get(7), llrec.get(5)) lftab.setvalue(fdif, llrec.get(7), llrec.get(6)) end for each pdrec in pftabdict pftab.setvalue(sf, pdrec.get(11), pdrec.get(7)) pftab.setvalue(wadf, pdrec.get(11), pdrec.get(8)) pftab.setvalue(wdif, pdrec.get(11), pdrec.get(9)) pftab.setvalue(wdf, pdrec.get(11), pdrec.get(10)) end end ' 'make attribute tables non editable ' lftab.seteditable(false) pftab.seteditable(false) ' 'final message to user ' if (converged) then message = "Time: " + (time * _tout).asstring + " " + _tlab message = message + nl + "Maximum delta s: " + maxdeltas.asstring + " " _slab messsage = message + nl + "BALANCE converged." msgbox.info(message,"BALANCE") end if (diverged) then message = "Time: " + (time * _tout).asstring + " " + _tlab message = message + nl + "Maximum delta s: " + maxdeltas.asstring + " " _slab message = message + nl + "BALANCE diverged." msgbox.info(message,"BALANCE") end if ((not converged) and (not diverged)) then message = "Time: " + (time * _tout).asstring + " " + _tlab message = message + nl + "Maximum delta s: " + maxdeltas.asstring + " " + _slab message = message + nl + "BALANCE time limit reached." msgbox.info(message,"BALANCE") end if (_oblevel >= 1) then av.showmsg("") av.setstatus(100) end ' '----------- '--- End --- '----------- '