*get,prkey_,active,0,prkey
/nopr
zMAXIT_=30
zUNUSED_=-1.11e30
zf_=arg1
zx1_=arg2
zx2_=arg3
zoffset_=arg4
zxacc_=arg5
*if,zoffset_,eq,0,then
zoffset_=0
*endif
*if,zxacc_,eq,0,then
zxacc_=1e-4
*endif
zdone_=0
/out,zero,out
*msg,,zxacc_
Results of zero.mac (xacc = %g):
*msg
*msg,,zoffset_
Loop
*msg
/out
*set,yzero
parsav,,zero,parm
%zf_%,zx1_
parres,change,zero,parm
zfl_=yzero-zoffset_
/out,zero,out,,append
*vwrite,zx1_,yzero,zfl_
(' x1 ',F18.6,E18.4,E18.3)
/out
*set,yzero
parsav,,zero,parm
%zf_%,zx2_
parres,change,zero,parm
zfh_=yzero-zoffset_
/out,zero,out,,append
*vwrite,zx2_,yzero,zfh_
(' x2 ',F18.4,E18.4,E18.3)
/out
and,'zb1_',zfl_>0,zfh_<0
and,'zb2_',zfl_<0,zfh_>0
or,'zb_',zb1_,zb2_
*if,zb_,ne,0,then
zxl_=zx1_
zxh_=zx2_
zans_=zUNUSED_
*do,zj_,1,zMAXIT_
zxm_=.5*(zxl_+zxh_)
*set,yzero
parsav,,zero,parm
%zf_%,zxm_
parres,change,zero,parm
zfm_=yzero-zoffset_
/out,zero,out,,append
*vwrite,zj_,zxm_,yzero,zfm_
(F3.0,' ',F18.4,E18.4,E18.3)
/out
zs_=sqrt(zfm_*zfm_-zfl_*zfh_)
*if,zs_,eq,0,then
zdone_=1
*exit
*endif
*if,zfl_,ge,zfh_,then
zsign_=1.0
*else
zsign_=-1.0
*endif
zxnew_=zxm_+(zxm_-zxl_)*zsign_*zfm_/zs_
*if,abs(zxnew_-zans_),le,zxacc_,then
zdone_=1
*exit
*endif
zans_=zxnew_
*set,yzero
parsav,,zero,parm
%zf_%,zans_
parres,change,zero,parm
zfnew_=yzero-zoffset_
/out,zero,out,,append
*vwrite,zxnew_,yzero,zfnew_
(' ',F18.4,E18.4,E18.3)
/out
*if,zfnew_,eq,0,then
zdone_=1
*exit
*endif
*if,zfnew_,ge,0,then
zb_=abs(zfm_)
*else
zb_=-abs(zfm_)
*endif
*if,zb_,ne,zfm_,then
zxl_=zxm_
zfl_=zfm_
zxh_=zans_
zfh_=zfnew_
*else
*if,zfnew_,ge,0,then
zb_=abs(zfl_)
*else
zb_=-abs(zfl_)
*endif
*if,zb_,ne,zfl_,then
zxh_=zans_
zfh_=zfnew_
*else
*if,zfnew_,ge,0,then
zb_=abs(zfh_)
*else
zb_=-abs(zfh_)
*endif
*if,zb_,ne,zfh_,then
zxl_=zans_
zfl_=zfnew_
*else
*msg,error
Error in zero.mac: Not supposed to get here.
*endif
*endif
*endif
*if,abs(zxh_-zxl_),le,zxacc_,then
zdone_=1
*exit
*endif
*enddo
*if,zdone_,eq,1,then
root=zans_
*else
*msg,error,zMAXIT_
Exceeded maximum iterations in %i in zero.mac
*endif
*else
*if,zfl_,eq,0,then
root=zx1_
zdone_=1
*endif
*if,zfh_,eq,0,then
root=zx2_
zdone_=1
*endif
*if,zdone_,eq,0,then
*msg,error
Root must be bracketed in zero.mac
*endif
*endif
*if,zdone_,eq,1,then
froot=zfnew_+zoffset_
/out,zero,out,,append
*msg
*msg,,root,froot
*** f(%g) = %g
*msg
*msg,,zj_
Found root in %i loops
/out
*uilist,zero,out
*endif
*set,zMAXIT_
*set,zUNUSED_
*set,zf_
*set,zx1_
*set,zx2_
*set,zoffset_
*set,zxacc_
*set,zdone_
*set,zfl_
*set,zfh_
*set,zfnew_
*set,zb_
*set,zb1_
*set,zb2_
*set,zans_
*set,zj_
*set,zxm_
*set,zxl_
*set,zxh_
*set,zfm_
*set,zs_
*set,zsign_
*set,zxnew_
*if,prkey_,eq,1,then
/go
*endif