#                                        Ren-Cang Li, June 1, 1996
#                                        na.rcli@na-net.ornl.gov

zItern:=proc(x0,y0,zL,zU,xM,yM,zM)
  local niter, xL, yL, zLi, zUi, xU, yU, eps, xi0, yi0, zi0, 
	xM0, yM0, xMi, yMi, zMi, xi1, yi1, zi1, fL, fU, f0, f1, fM;
  eps:=10^(-Digits+20): niter:=0:
  #
  zfixed(x0,y0,zL,'xL','yL'): 
  zfixed(x0,y0,zU,'xU','yU'): 
  fL:=subs(x=xL,y=yL,xfxyh)*( subs(x=xL,y=yL,z=zL,yf13h)
			     +subs(x=xL,y=yL,z=zL,zf13h) )
      -subs(x=xL,y=yL,yfxyh)*subs(x=xL,y=yL,z=zL,xf13h);
  fU:=subs(x=xU,y=yU,xfxyh)*( subs(x=xU,y=yU,z=zU,yf13h)
			     +subs(x=xU,y=yU,z=zU,zf13h) )
      -subs(x=xU,y=yU,yfxyh)*subs(x=xU,y=yU,z=zU,xf13h);
  if fL*fU>=0 then
     print(`Warning: there may be two zeros or NONE.`);
     print(`Please INTERRUPT to stop!`);
  fi:
  zLi:=zL: zUi:=zU:
  xi0:=xL: yi0:=yL: zi0:=zLi: f0:=fL: 
  xi1:=xU: yi1:=yU: zi1:=zUi: f1:=fU: 
  zMi :=zi1-f1*((zi1-zi0)/(f1-f0)):
  if zMi<zLi or zMi>zUi then
     zMi:=(zLi+zUi)/2:
     xM0:=evalm((xL+xU)/2):
     yM0:=evalm((yL+yU)/2):
  else
     xM0:=evalm((f0/(f0-f1))*xi1+(f1/(f1-f0))*xi0):
     yM0:=evalm((f0/(f0-f1))*yi1+(f1/(f1-f0))*yi0):
  fi:
  zfixed(xM0,yM0,zMi,'xMi','yMi'):
  fM:=subs(x=xMi,y=yMi,xfxyh)*( subs(x=xMi,y=yMi,z=zMi,yf13h)
			       +subs(x=xMi,y=yMi,z=zMi,zf13h) )
      -subs(x=xMi,y=yMi,yfxyh)*subs(x=xMi,y=yMi,z=zMi,xf13h);
  # print(fM); 
  while abs(zMi-zi1)>eps*abs(zMi) and niter<101 and abs(fM)>eps do
        niter := niter + 1:
        if fL*fM>=0 then
           xL:=xMi: yL:=yMi: zLi:=zMi: fL:=fM:
        else
           xU:=xMi: yU:=yMi: zUi:=zMi: fU:=fM:
        fi:
        xi0:=xi1: yi0:=yi1: zi0:=zi1: f0:=f1:
        xi1:=xMi:  yi1:=yMi:  zi1:=zMi:  f1:=fM:
        zMi:=zi1-f1*((zi1-zi0)/(f1-f0)):
        if zMi<zLi or zMi>zUi then
           zMi:=(zLi+zUi)/2:
           xM0:=evalm((xL+xU)/2):
           yM0:=evalm((yL+yU)/2):
        else
           xM0:=evalm((f0/(f0-f1))*xi1+(f1/(f1-f0))*xi0):
           yM0:=evalm((f0/(f0-f1))*yi1+(f1/(f1-f0))*yi0):
        fi:
        zfixed(xM0,yM0,zMi,'xMi','yMi'):
        fM:=subs(x=xMi,y=yMi,xfxyh)*( subs(x=xMi,y=yMi,z=zMi,yf13h)
      	                           +subs(x=xMi,y=yMi,z=zMi,zf13h) )
            -subs(x=xMi,y=yMi,yfxyh)*subs(x=xMi,y=yMi,z=zMi,xf13h);
        # print(fM); 
  od:
  if niter>100 then
     print(`In zItern: Over 100 iterations`):
  fi:
  xM:=xMi: yM:=yMi: zM:=zMi:
end:
