with Predictors; use Predictors;
package body Dispatch_Predictors is
procedure Single_Predictor
( s : in out Solu_Info; p : in Pred_Pars;
prev_x,prev_v : in Vector; v : in out Vector;
prev_t,target : in Complex_Number;
step,tol : in double_float; trial : in out natural ) is
procedure TR_Predictor is new Tangent_Single_Real_Predictor(Norm,dH,dH);
procedure TC_Predictor is new Tangent_Single_Complex_Predictor(Norm,dH,dH);
procedure TG_Predictor is new Tangent_Geometric_Predictor(Norm,dH,dH);
procedure HR_Predictor is new Hermite_Single_Real_Predictor(Norm,dH,dH);
begin
case p.predictor_type is
when 0 => Secant_Single_Real_Predictor
(s.sol.v,prev_x,s.sol.t,prev_t,target,step,tol,p.power);
when 1 => Secant_Single_Complex_Predictor
(s.sol.v,prev_x,s.sol.t,prev_t,target,step,tol,
p.dist_target,trial);
when 2 => Secant_Geometric_Predictor
(s.sol.v,prev_x,s.sol.t,prev_t,target,step,tol);
when 3 => TR_Predictor(s.sol.v,s.sol.t,target,step,tol,p.power);
s.nsyst := s.nsyst + 1;
when 4 => TC_Predictor
(s.sol.v,s.sol.t,target,step,tol,p.dist_target,trial);
s.nsyst := s.nsyst + 1;
when 5 => TG_Predictor(s.sol.v,s.sol.t,target,step,tol);
s.nsyst := s.nsyst + 1;
when 6 => HR_Predictor
(s.sol.v,prev_x,s.sol.t,prev_t,target,v,prev_v,step,tol);
s.nsyst := s.nsyst + 1;
when others => null;
end case;
end Single_Predictor;
procedure Multiple_Predictor
( s : in out Solu_Info_Array; p : in Pred_Pars;
sa : in out Solution_Array; prev_sa : in Solution_Array;
t : in out Complex_Number; prev_t,target : in Complex_Number;
step,tol,dist : in double_float; trial : in natural ) is
cnt : natural := 0;
procedure TR_Predictor is new Tangent_Multiple_Real_Predictor(Norm,dH,dH);
procedure TC_Predictor is
new Tangent_Multiple_Complex_Predictor(Norm,dH,dH);
begin
case p.predictor_type is
when 0 => Secant_Multiple_Real_Predictor
(sa,prev_sa,t,prev_t,target,step,tol,dist,p.power);
when 1 => Secant_Multiple_Complex_Predictor
(sa,prev_sa,t,prev_t,target,step,tol,dist,
p.dist_target,trial);
when 3 => TR_Predictor(sa,t,target,step,tol,dist,cnt,p.power);
for k in s'range loop
s(k).nsyst := s(k).nsyst + 1;
end loop;
when 4 => TC_Predictor
(sa,t,target,step,tol,dist,p.dist_target,trial,cnt);
for k in s'range loop
s(k).nsyst := s(k).nsyst + 1;
end loop;
when others => null;
end case;
end Multiple_Predictor;
end Dispatch_Predictors;