[BACK]Return to path_trackers.adb CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / PHC / Ada / Continuation

Annotation of OpenXM_contrib/PHC/Ada/Continuation/path_trackers.adb, Revision 1.1.1.1

1.1       maekawa     1: with integer_io;                         use integer_io;
                      2: with Standard_Floating_Numbers_io;       use Standard_Floating_Numbers_io;
                      3: with Standard_Complex_Numbers_io;        use Standard_Complex_Numbers_io;
                      4: with Standard_Mathematical_Functions;    use Standard_Mathematical_Functions;
                      5: with Standard_Floating_Vectors_io;       use Standard_Floating_Vectors_io;
                      6: with Standard_Floating_VecVecs;          use Standard_Floating_VecVecs;
                      7: with Standard_Complex_Norms_Equals;      use Standard_Complex_Norms_Equals;
                      8: with Predictors,Correctors;              use Predictors,Correctors;
                      9: with Dispatch_Predictors;                use Dispatch_Predictors;
                     10: with Continuation_Parameters;            use Continuation_Parameters;
                     11: with Process_io;                         use Process_io;
                     12: with Directions_of_Solution_Paths;       use Directions_of_Solution_Paths;
                     13:
                     14: package body Path_Trackers is
                     15:
                     16: -- AUXILIAIRIES :
                     17:
                     18:   function At_End ( t,target : Complex_Number; distance,tol : double_float )
                     19:                   return boolean is
                     20:
                     21:   -- DESCRIPTION :
                     22:   --   Decides whether at end of continuation stage.
                     23:
                     24:   begin
                     25:     if distance < tol
                     26:      then return Equal(t,target,tol);
                     27:      else if AbsVal(t-target) <= distance
                     28:            then return true;
                     29:            else return false;
                     30:           end if;
                     31:     end if;
                     32:   end At_End;
                     33:
                     34:   function Stop ( p : Pred_Pars; t,target : Complex_Number;
                     35:                   step : double_float ) return boolean is
                     36:
                     37:   -- DESCRIPTION :
                     38:   --   Returns true if either the step size is smaller than p.minstep, or
                     39:   --   or alternatively, in case of geometric predictor, if the distance to
                     40:   --   the target has become smaller than p.minstep.
                     41:
                     42:   begin
                     43:     if step <= p.minstep
                     44:      then return true;
                     45:      else if (p.predictor_type = 2) or (p.predictor_type = 5)
                     46:            then return (AbsVal(t-target) <= p.minstep);
                     47:            else return false;
                     48:           end if;
                     49:     end if;
                     50:   end Stop;
                     51:
                     52:   function Is_Multiple ( a,b,tol : double_float ) return integer is
                     53:
                     54:   -- DESCRIPTION :
                     55:   --   Returns a/b if a is a multiple of b, returns 0 in the other case.
                     56:
                     57:     fq : double_float;
                     58:     iq : integer;
                     59:   begin
                     60:     if abs(b) < tol
                     61:      then return 0;
                     62:      else fq := a/b;
                     63:           iq := integer(fq);
                     64:           if abs(fq - double_float(iq)) <= tol
                     65:            then return iq;
                     66:            else return 0;
                     67:           end if;
                     68:     end if;
                     69:   end Is_Multiple;
                     70:
                     71:   procedure Linear_Step_Control
                     72:               ( success : in boolean; p : in Pred_Pars;
                     73:                 step : in out double_float;
                     74:                 nsuccess : in out natural; trial : in natural ) is
                     75:
                     76:   -- DESCRIPTION :
                     77:   --   Control of step size for linear path following.
                     78:   --   With geometric prediction, the ratio (=step) will be enlarged
                     79:   --   when not success.  In order not to break the sequence, the ratio
                     80:   --   is not reduced when success.
                     81:
                     82:   begin
                     83:     if (p.predictor_type = 2) or (p.predictor_type = 5)
                     84:      then if success
                     85:            then nsuccess := nsuccess + 1;
                     86:            else nsuccess := 0;
                     87:                 if p.expfac < 1.0
                     88:                  then step := step + p.expfac*(1.0 - step);
                     89:                  else step := step + (1.0 - step)/p.expfac;
                     90:                 end if;
                     91:                 if step >= 1.0
                     92:                  then step := p.minstep/2.0;  -- that ends the game
                     93:                 end if;
                     94:           end if;
                     95:      else if success
                     96:            then nsuccess := nsuccess + 1;
                     97:                 if nsuccess > p.success_steps
                     98:                  then step := step*p.expfac;
                     99:                       if step > p.maxstep
                    100:                        then step := p.maxstep;
                    101:                       end if;
                    102:                 end if;
                    103:            else nsuccess := 0;
                    104:                 if trial mod 3 = 0
                    105:                  then step := step*p.redfac;
                    106:                 end if;
                    107:           end if;
                    108:     end if;
                    109:   end Linear_Step_Control;
                    110:
                    111:   procedure Circular_Step_Control
                    112:              ( success : in boolean; p : in Pred_Pars; twopi : in double_float;
                    113:                step : in out double_float; nsuccess : in out natural ) is
                    114:
                    115:   -- DESCRIPTION :
                    116:   --   Control of step size for circular path following, note that the
                    117:   --   step size should be some multiple of pi.
                    118:
                    119:     maxstep : constant double_float := p.maxstep*twopi;
                    120:
                    121:   begin
                    122:     if success
                    123:      then nsuccess := nsuccess + 1;
                    124:           if nsuccess > p.success_steps
                    125:            then step := step*2.0;          -- expansion factor = 2
                    126:                 if step > maxstep
                    127:                  then step := maxstep;
                    128:                 end if;
                    129:           end if;
                    130:      else nsuccess := 0;
                    131:           step := step*0.5;                -- reduction factor = 1/2
                    132:     end if;
                    133:   end Circular_Step_Control;
                    134:
                    135:   procedure Set_Corrector_Parameters
                    136:               ( c : in out Corr_Pars; eps : double_float ) is
                    137:
                    138:   -- DESCRIPTION :
                    139:   --   All eps* parameters in c are set to eps.
                    140:
                    141:   begin
                    142:     c.epsrx := eps; c.epsax := eps; c.epsrf := eps; c.epsaf := eps;
                    143:   end Set_Corrector_Parameters;
                    144:
                    145:   function End_Game_Corrector_Parameters
                    146:              ( current : Corr_Pars; distance,tol : double_float )
                    147:              return Corr_Pars is
                    148:
                    149:   -- DESCRIPTION :
                    150:   --   Returns corrector parameters for the end game of the first or the
                    151:   --   second continuation stage, depending on the distance from the target.
                    152:
                    153:     res : Corr_Pars := current;
                    154:
                    155:   begin
                    156:     if distance < tol                 -- correct further to detect clustering
                    157:      then res := current;
                    158:           Set_Corrector_Parameters(res,tol);
                    159:      else res := Create_End_Game;     -- or to move to end game more smoothly
                    160:     end if;
                    161:     return res;
                    162:   end End_Game_Corrector_Parameters;
                    163:
                    164: -- MANAGEMENT OF DATA DURING PATH FOLLOWING :
                    165:
                    166:   procedure Linear_Single_Initialize
                    167:                       ( s : in Solu_Info; p : in Pred_Pars;
                    168:                         old_t,prev_t : out Complex_Number;
                    169:                         prev_v,old_solution,prev_solution : out Vector ) is
                    170:
                    171:   -- DESCRIPTION :
                    172:   --   Initialization for linear path following of one path.
                    173:
                    174:   -- ON ENTRY :
                    175:   --   s                solution at beginning of path;
                    176:   --   p                predictor parameters.
                    177:
                    178:   -- ON RETURN :
                    179:   --   old_t            back up value for continuation parameter;
                    180:   --   prev_t           previous value of continuation parameter;
                    181:   --   old_solution     back up value for solution vector;
                    182:   --   prev_solution    previous value of solution vector;
                    183:
                    184:   begin
                    185:     old_t := s.sol.t; old_solution := s.sol.v;
                    186:     if p.predictor_type <= 2                    -- for all secant predictors
                    187:      then prev_t := s.sol.t;
                    188:           prev_solution := s.sol.v;
                    189:     end if;
                    190:     prev_v := (prev_v'range => Create(0.0));
                    191:   end Linear_Single_Initialize;
                    192:
                    193:   procedure Linear_Single_Management
                    194:                  ( s : in out Solu_Info; p : in Pred_Pars; c : in Corr_Pars;
                    195:                    old_t,prev_t : in out Complex_Number;
                    196:                    old_solution,prev_solution,old_v,prev_v,vv : in out Vector;
                    197:                    step : in out double_float; nsuccess,trial : in out natural;
                    198:                    success : in out boolean ) is
                    199:
                    200:   -- DESCRIPTION :
                    201:   --   Management of data after correction during linear path following.
                    202:
                    203:   -- PARAMETERS :
                    204:   --   s                current solution;
                    205:   --   p                predictor parameters;
                    206:   --   c                corrector parameters;
                    207:   --   old_t            back up value for continuation parameter;
                    208:   --   prev_t           previous value of continuation parameter;
                    209:   --   old_solution     back up value for solution vector;
                    210:   --   prev_solution    previous value of solution vector;
                    211:   --   old_v            back up value for tangent direction;
                    212:   --   prev_v           previous value for tangent direction;
                    213:   --   vv               current tangent direction;
                    214:   --   step             current step size;
                    215:   --   nsuccess         number of consecutive successes;
                    216:   --   trial            number of trials after failure;
                    217:   --   success          successful correction step.
                    218:
                    219:   begin
                    220:     success := (((s.resa <= c.epsaf) or else (s.cora <= c.epsax))
                    221:         or else ((s.resr <= c.epsrf) or else (s.corr <= c.epsrx)));
                    222:     if ((p.predictor_type <= 2) and then success)         -- secant predictors
                    223:      then prev_t := old_t;
                    224:           prev_solution := old_solution;
                    225:     end if;
                    226:     if ((p.predictor_type = 6) and then success)          -- Hermite predictor
                    227:      then prev_t := old_t;
                    228:           prev_solution := old_solution;
                    229:           prev_v := old_v;
                    230:     end if;
                    231:     if ((p.predictor_type = 1) or (p.predictor_type = 3)) -- complex predictors
                    232:      then if success
                    233:            then trial := 0;
                    234:            else trial := trial + 1;
                    235:           end if;
                    236:     end if;
                    237:     s.nstep := s.nstep + 1;
                    238:     if not success
                    239:      then s.nfail := s.nfail + 1;
                    240:      end if;
                    241:     Linear_Step_Control(success,p,step,nsuccess,trial);
                    242:     if step < p.minstep
                    243:      then return;
                    244:     end if;
                    245:     if not success
                    246:      then s.sol.t := old_t;
                    247:           s.sol.v := old_solution;
                    248:      else old_t := s.sol.t;
                    249:           old_solution := s.sol.v;
                    250:           if p.predictor_type = 6
                    251:            then old_v := vv;
                    252:           end if;
                    253:     end if;
                    254:   end Linear_Single_Management;
                    255:
                    256:   procedure Linear_Multiple_Initialize
                    257:                  ( s : in Solu_Info_Array; p : in Pred_Pars;
                    258:                    t,old_t,prev_t : out Complex_Number;
                    259:                    sa,old_sa,prev_sa : in out Solution_Array ) is
                    260:
                    261:   -- DECRIPTION :
                    262:   --   Initialization for linear path following for more than one path.
                    263:
                    264:   begin
                    265:     t := s(s'first).sol.t;
                    266:     old_t := s(s'first).sol.t;
                    267:     Copy(s,sa); Copy(sa,old_sa);
                    268:     case p.predictor_type is
                    269:       when 0 | 1 | 2 => prev_t := s(s'first).sol.t; Copy(sa,prev_sa);
                    270:       when others => null;
                    271:     end case;
                    272:   end Linear_Multiple_Initialize;
                    273:
                    274:   procedure Linear_Multiple_Management
                    275:                   ( s : in out Solu_Info_array;
                    276:                     sa,old_sa,prev_sa : in out Solution_Array;
                    277:                     t,old_t,prev_t : in out Complex_Number; p : in Pred_Pars;
                    278:                     step : in out double_float; pivot : in natural;
                    279:                     nsuccess,trial : in out natural; success : in boolean ) is
                    280:
                    281:   -- DESCRIPTION :
                    282:   --   Management of data after correction during linear path following.
                    283:
                    284:   -- PARAMETERS :
                    285:   --   s            current solutions with information statistics;
                    286:   --   sa           current solutions;
                    287:   --   old_sa       back up value for solutions;
                    288:   --   prev_sa      previous solutions;
                    289:   --   t            current value of continuation parameter;
                    290:   --   old_t        back up value for continuation parameter;
                    291:   --   prev_t       previous value of continuation parameter;
                    292:   --   p            predictor parameters;
                    293:   --   step         current step size;
                    294:   --   pivot        solution where correction is started;
                    295:   --   nsuccess     number of consecutive successes;
                    296:   --   trial        number of trials after failure;
                    297:   --   success      successful correction step.
                    298:
                    299:   begin
                    300:     if ((p.predictor_type <= 2) and then success)      -- for secant predictors
                    301:      then prev_t := old_t; Copy(old_sa,prev_sa);
                    302:     end if;
                    303:     if ((p.predictor_type = 1) or (p.predictor_type = 3)) -- complex predictors
                    304:      then if success
                    305:            then trial := 0;
                    306:            else trial := trial + 1;
                    307:           end if;
                    308:     end if;
                    309:     for k in s'range loop
                    310:       s(k).nstep := s(k).nstep + 1;
                    311:     end loop;
                    312:     if not success
                    313:      then s(pivot).nfail := s(pivot).nfail + 1;
                    314:     end if;
                    315:     Linear_Step_Control(success,p,step,nsuccess,trial);
                    316:     if step < p.minstep then return; end if;
                    317:     if success
                    318:      then Copy(sa,old_sa); old_t := t;
                    319:      else Copy(old_sa,sa); t := old_t;
                    320:     end if;
                    321:   end Linear_Multiple_Management;
                    322:
                    323:   procedure Circular_Management
                    324:                    ( s : in out Solu_Info; p : in Pred_Pars; c : in Corr_Pars;
                    325:                      old_t,prev_t : in out Complex_Number;
                    326:                      start_solution : in Vector;
                    327:                      old_solution,prev_solution,w_sum,w_all_sum : in out Vector;
                    328:                      twopi,epslop,tol : in double_float;
                    329:                      theta,old_theta,step : in out double_float;
                    330:                      nsuccess,n_sum,n_all_sum,w_c : in out natural;
                    331:                      max_wc : in natural; stop,success : in out boolean ) is
                    332:
                    333:   -- DESCRIPTION :
                    334:   --   Management of circular path following.
                    335:
                    336:   -- PARAMETERS :
                    337:   --   s                current solution;
                    338:   --   p                predictor parameters;
                    339:   --   c                corrector parameters;
                    340:   --   old_t            back up value for continuation parameter;
                    341:   --   prev_t           previous value of continuation parameter;
                    342:   --   start_solution   solution vector at start of continuation;
                    343:   --   old_solution     back up value for solution vector;
                    344:   --   prev_solution    previous value of solution vector;
                    345:   --   w_sum            sum of cycle;
                    346:   --   w_all_sum        sum of all cycles;
                    347:   --   twopi            two times PI;
                    348:   --   epslop           tolerance to decide whether two vectors are equal;
                    349:   --   theta            current value of theta;
                    350:   --   old_theta        back up value for theta;
                    351:   --   step             current step size;
                    352:   --   nsuccess         number of consecutive successes;
                    353:   --   n_sum            number of cycles;
                    354:   --   n_all_sum        total number of cycles;
                    355:   --   w_c              winding number;
                    356:   --   max_wc           upper bound on winding number;
                    357:   --   stop             true when winding number has been computed;
                    358:   --   success          successful correction step.
                    359:
                    360:     tmp : integer;
                    361:
                    362:   begin
                    363:     success := (((s.resa <= c.epsaf) or else (s.cora <= c.epsax))
                    364:         or else ((s.resr <= c.epsrf) or else (s.corr <= c.epsrx)));
                    365:     if p.predictor_type = 0 and then success
                    366:      then prev_t := old_t;
                    367:           prev_solution := old_solution;
                    368:     end if;
                    369:     s.nstep := s.nstep + 1;
                    370:     if not success then s.nfail := s.nfail + 1; end if;
                    371:     if success
                    372:      then old_theta := theta; old_t := s.sol.t;
                    373:           old_solution := s.sol.v;
                    374:           w_all_sum := w_all_sum + s.sol.v;
                    375:           n_all_sum := n_all_sum + 1;
                    376:           tmp := Is_Multiple(theta,twopi*p.maxstep,tol);
                    377:           if tmp /= 0
                    378:            then w_sum := w_sum + s.sol.v; n_sum := n_sum + 1;
                    379:           end if;
                    380:           w_c := Is_Multiple(theta,twopi,tol);
                    381:           if w_c /= 0
                    382:            then if Equal(s.sol.v,start_solution,epslop)
                    383:                  then w_sum := w_sum - s.sol.v * Create(0.5);
                    384:                       w_all_sum := w_all_sum - s.sol.v * Create(0.5);
                    385:                       stop := true;
                    386:                  else stop := (w_c >= max_wc);
                    387:                 end if;
                    388:           end if;
                    389:      else theta := old_theta;
                    390:           s.sol.t := old_t;
                    391:           s.sol.v := old_solution;
                    392:     end if;
                    393:     if not stop
                    394:      then Circular_Step_Control(success,p,twopi,step,nsuccess);
                    395:     end if;
                    396:   end Circular_Management;
                    397:
                    398: -- UPDATE OF PATH DIRECTION :
                    399:
                    400:   procedure Update_Direction
                    401:                 ( proj : in boolean;
                    402:                   freqcnt,defer,r,m,estm,cntm : in out natural;
                    403:                   thresm : in natural; er : in out integer;
                    404:                   t,target : in Complex_Number; x : in Vector;
                    405:                   dt,s,logs : in out Standard_Floating_Vectors.Vector;
                    406:                   logx,wvl0,wvl1,wvl2 : in out VecVec;
                    407:                   v,errv : in out Standard_Floating_Vectors.Vector;
                    408:                   err : in out double_float ) is
                    409:
                    410:   -- DESCRIPTION :
                    411:   --   Computes an approximation of the direction of the path.
                    412:
                    413:   -- ON ENTRY :
                    414:   --   file       to write intermediate data on, may be omitted;
                    415:   --   proj       whether solution vector lies in projective space;
                    416:   --   freqcnt    counts the frequency of calls;
                    417:   --   defer      only if freqcnt = defer, calculations are done;
                    418:   --   r          current order in extrapolation formula;
                    419:   --   m          current value for multiplicity;
                    420:   --   estm       current estimated for multiplicity;
                    421:   --   cntm       number of consecutive times estm has been guessed;
                    422:   --   thresm     threshold for augmenting m to estm;
                    423:   --   er         order of extrapolator on the errors;
                    424:   --   t          current value of continuation parameter;
                    425:   --   target     target value of continuation parameter;
                    426:   --   x          current solution vector;
                    427:   --   dt         vector with distances to target;
                    428:   --   s          s-values w.r.t. the current value m;
                    429:   --   logs       logarithms of the s-values;
                    430:   --   logx       logarithms of the solution vectors;
                    431:   --   wvl0       consecutive estimates for previous direction;
                    432:   --   wvl1       consecutive estimates for current direction;
                    433:   --   wvl2       used as work space for wvl0 and wvl1;
                    434:   --   v          current approximate direction of the path;
                    435:   --   errv       vector of errors used to estimate m;
                    436:   --   err        norm of errv.
                    437:
                    438:   -- ON RETURN :
                    439:   --   All in-out variables are updated, provided freqcnt = defer.
                    440:
                    441:   begin
                    442:     if freqcnt >= defer
                    443:      then
                    444:        freqcnt := 0;
                    445:        if proj
                    446:         then Projective_Update_Direction
                    447:                (r,m,estm,cntm,thresm,er,t,target,x,dt,s,logs,logx,v,errv,err);
                    448:         else Affine_Update_Direction
                    449:                (r,m,estm,cntm,thresm,er,t,target,x,
                    450:                 dt,s,logs,logx,wvl0,wvl1,wvl2,v,errv,err);
                    451:        end if;
                    452:       -- defer := defer + 1;  -- that is asking for troubles !
                    453:      else
                    454:        freqcnt := freqcnt + 1;
                    455:     end if;
                    456:   end Update_Direction;
                    457:
                    458:   procedure Update_Direction
                    459:                 ( file : in file_type; proj : in boolean;
                    460:                   freqcnt,defer,r,m,estm,cntm : in out natural;
                    461:                   thresm : in natural; er : in out integer;
                    462:                   t,target : in Complex_Number; x : in Vector;
                    463:                   dt,s,logs : in out Standard_Floating_Vectors.Vector;
                    464:                   logx,wvl0,wvl1,wvl2 : in out VecVec;
                    465:                   v,errv : in out Standard_Floating_Vectors.Vector;
                    466:                   err : in out double_float ) is
                    467:
                    468:   -- DESCRIPTION :
                    469:   --   Computes an approximation of the direction of the path and produces
                    470:   --   intermediate output to the file.
                    471:
                    472:   begin
                    473:     if freqcnt >= defer
                    474:      then
                    475:        freqcnt := 0;
                    476:        if proj
                    477:         then Projective_Update_Direction
                    478:                (file,r,m,estm,cntm,thresm,er,t,target,x,
                    479:                      dt,s,logs,logx,v,errv,err);
                    480:         else Affine_Update_Direction
                    481:                (file,r,m,estm,cntm,thresm,er,t,target,x,
                    482:                      dt,s,logs,logx,wvl0,wvl1,wvl2,v,errv,err);
                    483:        end if;
                    484:       -- defer := defer + 1;  -- asking for troubles !
                    485:        put(file,"direction : "); put(file,v); new_line(file);
                    486:        put(file,"difference to old direction : "); put(file,err);
                    487:        new_line(file);
                    488:        put(file,"++ current m : "); put(file,m,1); put(file," ++ ");
                    489:        put(file,cntm,1); put(file," times estimated m : "); put(file,estm,1);
                    490:        put(file," ++ threshold : "); put(file,thresm,1); put_line(file," ++");
                    491:        new_line(file);
                    492:      else
                    493:        freqcnt := freqcnt + 1;
                    494:     end if;
                    495:   end Update_Direction;
                    496:
                    497: -- LINEAR PATH FOLLOWING FOR ONE PATH :
                    498:
                    499:   procedure Linear_Single_Normal_Silent_Continue
                    500:               ( s : in out Solu_Info; target : in Complex_Number;
                    501:                 tol : in double_float; proj : in boolean;
                    502:                 p : in Pred_Pars; c : in Corr_Pars ) is
                    503:
                    504:     old_t,prev_t : Complex_Number;
                    505:     old_solution,prev_solution,old_v,prev_v,vv : Vector(s.sol.v'range);
                    506:     step : double_float := p.maxstep;
                    507:     nsuccess,trial : natural := 0;
                    508:     success : boolean := true;
                    509:
                    510:     procedure Predictor is new Single_Predictor(Norm,dH,dH);
                    511:
                    512:     procedure Corrector ( s : in out Solu_Info; c : in Corr_Pars ) is
                    513:
                    514:       procedure Affine_Corrector is
                    515:         new Affine_Single_Severe_Normal_Silent_Corrector(Norm,H,dH);
                    516:       procedure Projective_Corrector is
                    517:         new Projective_Single_Severe_Normal_Silent_Corrector(Norm,H,dH);
                    518:
                    519:     begin
                    520:       if proj
                    521:        then Projective_Corrector(s,c);
                    522:        else Affine_Corrector(s,c);
                    523:       end if;
                    524:     end Corrector;
                    525:
                    526:   begin
                    527:     Linear_Single_Initialize
                    528:       (s,p,old_t,prev_t,prev_v,old_solution,prev_solution);
                    529:     while not (At_End(s.sol.t,target,p.dist_target,tol) and success)
                    530:                                            and (s.niter <= c.maxtot) loop
                    531:
                    532:       Predictor(s,p,prev_solution,prev_v,vv,prev_t,target,step,tol,trial);
                    533:       Corrector(s,c);
                    534:       Linear_Single_Management(s,p,c,old_t,prev_t,old_solution,prev_solution,
                    535:                                old_v,prev_v,vv,step,nsuccess,trial,success);
                    536:       if Stop(p,s.sol.t,target,step) then return; end if;
                    537:     end loop;
                    538:     declare
                    539:       cp : Corr_Pars := End_Game_Corrector_Parameters(c,p.dist_target,tol);
                    540:     begin
                    541:       Corrector(s,cp);
                    542:     end;
                    543:   end Linear_Single_Normal_Silent_Continue;
                    544:
                    545:   procedure Linear_Single_Normal_Reporting_Continue
                    546:               ( file : in file_type; s : in out Solu_Info;
                    547:                 target : in Complex_Number; tol : in double_float;
                    548:                 proj : in boolean; p : in Pred_Pars; c : in Corr_Pars ) is
                    549:
                    550:     old_t,prev_t : Complex_Number;
                    551:     old_solution,prev_solution,old_v,prev_v,vv : Vector(s.sol.v'range);
                    552:     step : double_float := p.maxstep;
                    553:     nsuccess,trial : natural := 0;
                    554:     success : boolean := true;
                    555:
                    556:     procedure Predictor is new Single_Predictor(Norm,dH,dH);
                    557:
                    558:     procedure Corrector ( s : in out Solu_Info; c : in Corr_Pars ) is
                    559:
                    560:       procedure Affine_Corrector is
                    561:         new Affine_Single_Severe_Normal_Reporting_Corrector(Norm,H,dH);
                    562:       procedure Projective_Corrector is
                    563:         new Projective_Single_Severe_Normal_Reporting_Corrector(Norm,H,dH);
                    564:
                    565:     begin
                    566:       if proj
                    567:        then Projective_Corrector(file,s,c);
                    568:        else Affine_Corrector(file,s,c);
                    569:       end if;
                    570:     end Corrector;
                    571:
                    572:   begin
                    573:     Linear_Single_Initialize
                    574:       (s,p,old_t,prev_t,prev_v,old_solution,prev_solution);
                    575:     sWrite(file,s.sol.all);
                    576:     while not (At_End(s.sol.t,target,p.dist_target,tol) and success)
                    577:                                            and (s.niter <= c.maxtot) loop
                    578:
                    579:       Predictor(s,p,prev_solution,prev_v,vv,prev_t,target,step,tol,trial);
                    580:       if p.predictor_type = 6
                    581:        then put_line(file,"previous and current direction : ");
                    582:             for i in prev_v'range loop
                    583:               put(file,prev_v(i),3,3,3);  put(file,"   ");
                    584:               put(file,vv(i),3,3,3);      new_line(file);
                    585:             end loop;
                    586:       end if;
                    587:       pWrite(file,step,s.sol.t,s.sol.all);
                    588:       Corrector(s,c);
                    589:       sWrite(file,s.sol.all);
                    590:       Linear_Single_Management(s,p,c,old_t,prev_t,old_solution,prev_solution,
                    591:                                old_v,prev_v,vv,step,nsuccess,trial,success);
                    592:       if Stop(p,s.sol.t,target,step) then return; end if;
                    593:     end loop;
                    594:     declare
                    595:       cp : Corr_Pars := End_Game_Corrector_Parameters(c,p.dist_target,tol);
                    596:     begin
                    597:       Corrector(s,cp);
                    598:       sWrite(file,s.sol.all);
                    599:     end;
                    600:   end Linear_Single_Normal_Reporting_Continue;
                    601:
                    602:   procedure Linear_Single_Conditioned_Silent_Continue
                    603:               ( s : in out Solu_Info; target : in Complex_Number;
                    604:                 tol : in double_float; proj : in boolean;
                    605:                 rtoric : in natural;
                    606:                 v : in out Standard_Floating_Vectors.Link_to_Vector;
                    607:                 errorv : in out double_float;
                    608:                 p : in Pred_Pars; c : in Corr_Pars ) is
                    609:
                    610:     old_t,prev_t : Complex_Number;
                    611:     old_solution,prev_solution,old_v,prev_v,vv : Vector(s.sol.v'range);
                    612:     step : double_float := p.maxstep;
                    613:     nsuccess,trial : natural := 0;
                    614:     success : boolean := true;
                    615:
                    616:     dls,stp : double_float := 0.0;
                    617:     tolsing : constant double_float
                    618:             := Continuation_Parameters.tol_endg_inverse_condition;
                    619:     diff : Standard_Floating_Vectors.Vector(s.sol.v'range)
                    620:          := (s.sol.v'range => 0.0);
                    621:
                    622:     r : natural := 0;
                    623:     er : integer := 0;
                    624:     dt,ds,logs : Standard_Floating_Vectors.Vector(0..rtoric)
                    625:                := (0..rtoric => 0.0);
                    626:     logx : VecVec(0..rtoric);
                    627:     wvl0,wvl1,wvl2 : VecVec(1..rtoric);
                    628:     errv : Standard_Floating_Vectors.Vector(0..rtoric) := (0..rtoric => 0.0);
                    629:
                    630:     m : natural := 1;
                    631:     thresm : natural := p.success_steps;
                    632:     estm : natural := m;
                    633:     fcnt,cntm : natural := 0;
                    634:     defer : natural := thresm;
                    635:
                    636:     procedure Predictor is new Single_Predictor(Norm,dH,dH);
                    637:
                    638:     procedure Corrector ( s : in out Solu_Info; c : in Corr_Pars ) is
                    639:
                    640:       procedure Affine_Corrector is
                    641:         new Affine_Single_Severe_Conditioned_Silent_Corrector(Norm,H,dH);
                    642:       procedure Projective_Corrector is
                    643:         new Projective_Single_Severe_Conditioned_Silent_Corrector(Norm,H,dH);
                    644:
                    645:     begin
                    646:       if proj
                    647:        then Projective_Corrector(s,c);
                    648:        else Affine_Corrector(s,c);
                    649:       end if;
                    650:     end Corrector;
                    651:
                    652:   begin
                    653:     Linear_Single_Initialize
                    654:       (s,p,old_t,prev_t,prev_v,old_solution,prev_solution);
                    655:     if rtoric > 0
                    656:      then s.sol.m := m;
                    657:     end if;
                    658:     while not (At_End(s.sol.t,target,p.dist_target,tol) and success)
                    659:                                            and (s.niter <= c.maxtot) loop
                    660:
                    661:       if (rtoric > 0)
                    662:        then
                    663:          if success and then s.rcond > tolsing
                    664:                     and then (errorv < 100.0) -- avoid divergence
                    665:           then Update_Direction
                    666:                  (proj,fcnt,defer,r,s.sol.m,estm,cntm,thresm,er,s.sol.t,target,
                    667:                   s.sol.v,dt,ds,logs,logx,wvl0,wvl1,wvl2,v.all,errv,errorv);
                    668:           else er := -2;
                    669:          end if;
                    670:       end if;
                    671:
                    672:       Predictor(s,p,prev_solution,prev_v,vv,prev_t,target,step,tol,trial);
                    673:       Corrector(s,c);
                    674:       Linear_Single_Management(s,p,c,old_t,prev_t,old_solution,prev_solution,
                    675:                                old_v,prev_v,vv,step,nsuccess,trial,success);
                    676:       if Stop(p,s.sol.t,target,step) then return; end if;
                    677:     end loop;
                    678:     declare
                    679:       cp : Corr_Pars := End_Game_Corrector_Parameters(c,p.dist_target,tol);
                    680:     begin
                    681:       Corrector(s,cp);
                    682:     end;
                    683:   end Linear_Single_Conditioned_Silent_Continue;
                    684:
                    685:   procedure Linear_Single_Conditioned_Reporting_Continue
                    686:               ( file : in file_type; s : in out Solu_Info;
                    687:                 target : in Complex_Number; tol : in double_float;
                    688:                 proj : in boolean; rtoric : in natural;
                    689:                 v : in out Standard_Floating_Vectors.Link_to_Vector;
                    690:                 errorv : in out double_float;
                    691:                 p : in Pred_Pars; c : in Corr_Pars ) is
                    692:
                    693:     old_t,prev_t : Complex_Number;
                    694:     step : double_float := p.maxstep;
                    695:     nsuccess,trial : natural := 0;
                    696:     old_solution,prev_solution,old_v,prev_v,vv : Vector(s.sol.v'range);
                    697:     success : boolean := true;
                    698:
                    699:     dls,stp : double_float := 0.0;
                    700:     tolsing : constant double_float
                    701:             := Continuation_Parameters.tol_endg_inverse_condition;
                    702:     diff : Standard_Floating_Vectors.Vector(s.sol.v'range)
                    703:          := (s.sol.v'range => 0.0);
                    704:
                    705:     r : natural := 0;
                    706:     er : integer := 0;
                    707:     dt,ds,logs : Standard_Floating_Vectors.Vector(0..rtoric)
                    708:                := (0..rtoric => 0.0);
                    709:     logx : VecVec(0..rtoric);
                    710:     wvl0,wvl1,wvl2 : VecVec(1..rtoric);
                    711:     errv : Standard_Floating_Vectors.Vector(0..rtoric) := (0..rtoric => 0.0);
                    712:
                    713:     m : natural := 1;
                    714:     thresm : natural := p.success_steps;
                    715:     estm : natural := m;
                    716:     fcnt,cntm : natural := 0;
                    717:     defer : natural := thresm;
                    718:
                    719:     procedure Predictor is new Single_Predictor(Norm,dH,dH);
                    720:
                    721:     procedure Corrector ( s : in out Solu_Info; c : in Corr_Pars ) is
                    722:
                    723:       procedure Affine_Corrector is
                    724:         new Affine_Single_Severe_Conditioned_Reporting_Corrector(Norm,H,dH);
                    725:       procedure Projective_Corrector is
                    726:         new Projective_Single_Severe_Conditioned_Reporting_Corrector(Norm,H,dH);
                    727:
                    728:     begin
                    729:       if proj
                    730:        then Projective_Corrector(file,s,c);
                    731:        else Affine_Corrector(file,s,c);
                    732:       end if;
                    733:     end Corrector;
                    734:
                    735:   begin
                    736:     Linear_Single_Initialize
                    737:       (s,p,old_t,prev_t,prev_v,old_solution,prev_solution);
                    738:     sWrite(file,s.sol.all);          -- writing the start solution
                    739:     if rtoric > 0
                    740:      then s.sol.m := m;
                    741:     end if;
                    742:     while not (At_End(s.sol.t,target,p.dist_target,tol) and success)
                    743:                                            and (s.niter <= c.maxtot) loop
                    744:
                    745:       if (rtoric > 0)
                    746:        then
                    747:          if success and then s.rcond > tolsing
                    748:                     and then (errorv < 100.0) -- avoid divergence
                    749:           then Update_Direction(file,
                    750:                   proj,fcnt,defer,r,s.sol.m,estm,cntm,thresm,er,s.sol.t,target,
                    751:                   s.sol.v,dt,ds,logs,logx,wvl0,wvl1,wvl2,v.all,errv,errorv);
                    752:           else er := -2;
                    753:          end if;
                    754:       end if;
                    755:
                    756:       Predictor(s,p,prev_solution,prev_v,vv,prev_t,target,step,tol,trial);
                    757:       pWrite(file,step,s.sol.t,s.sol.all);
                    758:       Corrector(s,c);
                    759:       sWrite(file,s.sol.all);
                    760:       Linear_Single_Management(s,p,c,old_t,prev_t,old_solution,prev_solution,
                    761:                                old_v,prev_v,vv,step,nsuccess,trial,success);
                    762:       if Stop(p,s.sol.t,target,step) then return; end if;
                    763:     end loop;
                    764:     declare
                    765:       cp : Corr_Pars := End_Game_Corrector_Parameters(c,p.dist_target,tol);
                    766:     begin
                    767:       Corrector(s,cp);
                    768:       sWrite(file,s.sol.all);
                    769:     end;
                    770:   end Linear_Single_Conditioned_Reporting_Continue;
                    771:
                    772: -- LINEAR PATH FOLLOWING FOR A NUMBER OF PATHS :
                    773:
                    774:   procedure Linear_Multiple_Normal_Silent_Continue
                    775:               ( s : in out Solu_Info_Array;
                    776:                 target : in Complex_Number; tol,dist_sols : in double_float;
                    777:                 proj : in boolean; p : in Pred_Pars; c : in Corr_Pars ) is
                    778:
                    779:     t,old_t,prev_t : Complex_Number;
                    780:     sa,old_sa,prev_sa : Solution_Array(s'range);
                    781:     step : double_float := p.maxstep;
                    782:     cnt,nsuccess,trial : natural := 0;
                    783:     pivot : natural := s'first;
                    784:     success,fail : boolean := true;
                    785:
                    786:     procedure Predictor is new Multiple_Predictor(Norm,dH,dH);
                    787:
                    788:     procedure Affine_Corrector is
                    789:       new Affine_Multiple_Loose_Normal_Silent_Corrector(Norm,H,dH);
                    790:     procedure Projective_Corrector is
                    791:       new Projective_Multiple_Loose_Normal_Silent_Corrector(Norm,H,dH);
                    792:
                    793:     procedure Correct ( s : in out Solu_Info_Array;
                    794:                         pivot : in out natural; dist_sols : in double_float;
                    795:                         c : in Corr_Pars; fail : out boolean ) is
                    796:     begin
                    797:       Copy(sa,s);
                    798:       if proj
                    799:        then Projective_Corrector(s,pivot,dist_sols,c,fail);
                    800:        else Affine_Corrector(s,pivot,dist_sols,c,fail);
                    801:       end if;
                    802:     end Correct;
                    803:
                    804:   begin
                    805:     Linear_Multiple_Initialize(s,p,t,old_t,prev_t,sa,old_sa,prev_sa);
                    806:     while not (At_End(t,target,p.dist_target,tol) and success)
                    807:                             and (s(s'first).niter <= c.maxtot) loop
                    808:
                    809:       Predictor(s,p,sa,prev_sa,t,prev_t,target,step,tol,dist_sols,trial);
                    810:       Correct(s,pivot,dist_sols,c,fail); Copy(s,sa);
                    811:       success := not fail;
                    812:       Linear_Multiple_Management(s,sa,old_sa,prev_sa,t,old_t,prev_t,p,step,
                    813:                                  pivot,nsuccess,trial,success);
                    814:       if step < p.minstep then return; end if;
                    815:     end loop;
                    816:     declare
                    817:       cp : Corr_Pars := End_Game_Corrector_Parameters(c,p.dist_target,tol);
                    818:     begin
                    819:       Correct(s,pivot,dist_sols,cp,fail);
                    820:     end;
                    821:   end Linear_Multiple_Normal_Silent_Continue;
                    822:
                    823:   procedure Linear_Multiple_Normal_Reporting_Continue
                    824:               ( file : in file_type; s : in out Solu_Info_Array;
                    825:                 target : in Complex_Number; tol,dist_sols : in double_float;
                    826:                 proj : in boolean; p : in Pred_Pars; c : in Corr_Pars ) is
                    827:
                    828:     t,old_t,prev_t : Complex_Number;
                    829:     sa,old_sa,prev_sa : Solution_Array(s'range);
                    830:     step : double_float := p.maxstep;
                    831:     pivot : natural := s'first;
                    832:     cnt,nsuccess,trial : natural := 0;
                    833:     success,fail : boolean := true;
                    834:
                    835:     procedure Predictor is new Multiple_Predictor(Norm,dH,dH);
                    836:
                    837:     procedure Affine_Corrector is
                    838:       new Affine_Multiple_Loose_Normal_Reporting_Corrector(Norm,H,dH);
                    839:     procedure Projective_Corrector is
                    840:       new Projective_Multiple_Loose_Normal_Reporting_Corrector(Norm,H,dH);
                    841:
                    842:     procedure Correct ( file : in file_type; s : in out Solu_Info_Array;
                    843:                         pivot : in out natural; dist_sols : in double_float;
                    844:                         c : in Corr_Pars; fail : out boolean ) is
                    845:     begin
                    846:       Copy(sa,s);
                    847:       if proj
                    848:        then Projective_Corrector(file,s,pivot,dist_sols,c,fail);
                    849:        else Affine_Corrector(file,s,pivot,dist_sols,c,fail);
                    850:       end if;
                    851:     end Correct;
                    852:
                    853:   begin
                    854:     Linear_Multiple_Initialize(s,p,t,old_t,prev_t,sa,old_sa,prev_sa);
                    855:     for k in s'range loop                       -- write the start solutions
                    856:       sWrite(file,sa(k).all);
                    857:     end loop;
                    858:     while not (At_End(t,target,p.dist_target,tol) and success)
                    859:                             and (s(s'first).niter <= c.maxtot) loop
                    860:
                    861:       Predictor(s,p,sa,prev_sa,t,prev_t,target,step,tol,dist_sols,trial);
                    862:       pWrite(file,step,t);
                    863:       Correct(file,s,pivot,dist_sols,c,fail); Copy(s,sa);
                    864:       success := not fail;
                    865:       Linear_Multiple_Management(s,sa,old_sa,prev_sa,t,old_t,prev_t,p,step,
                    866:                                  pivot,nsuccess,trial,success);
                    867:       if step < p.minstep then return; end if;
                    868:     end loop;
                    869:     declare
                    870:       cp : Corr_Pars := End_Game_Corrector_Parameters(c,p.dist_target,tol);
                    871:     begin
                    872:       Correct(file,s,pivot,dist_sols,cp,fail);
                    873:     end;
                    874:   end Linear_Multiple_Normal_Reporting_Continue;
                    875:
                    876:   procedure Linear_Multiple_Conditioned_Silent_Continue
                    877:               ( s : in out Solu_Info_Array;
                    878:                 target : in Complex_Number; tol,dist_sols : in double_float;
                    879:                 proj : in boolean; p : in Pred_Pars; c : in Corr_Pars ) is
                    880:
                    881:     t,old_t,prev_t : Complex_Number;
                    882:     sa,old_sa,prev_sa : Solution_Array(s'range);
                    883:     step : double_float := p.maxstep;
                    884:     pivot : natural := s'first;
                    885:     cnt,nsuccess,trial : natural := 0;
                    886:     success,fail : boolean := true;
                    887:
                    888:     procedure Predictor is new Multiple_Predictor(Norm,dH,dH);
                    889:
                    890:     procedure Affine_Corrector is
                    891:       new Affine_Multiple_Loose_Conditioned_Silent_Corrector(Norm,H,dH);
                    892:     procedure Projective_Corrector is
                    893:       new Projective_Multiple_Loose_Conditioned_Silent_Corrector(Norm,H,dH);
                    894:
                    895:     procedure Correct ( s : in out Solu_Info_Array;
                    896:                         pivot : in out natural; dist_sols : in double_float;
                    897:                         c : in Corr_Pars; fail : out boolean ) is
                    898:     begin
                    899:       Copy(sa,s);
                    900:       if proj
                    901:        then Projective_Corrector(s,pivot,dist_sols,c,fail);
                    902:        else Affine_Corrector(s,pivot,dist_sols,c,fail);
                    903:       end if;
                    904:     end Correct;
                    905:
                    906:   begin
                    907:     Linear_Multiple_Initialize(s,p,t,old_t,prev_t,sa,old_sa,prev_sa);
                    908:     while not (At_End(t,target,p.dist_target,tol) and success)
                    909:                             and (s(s'first).niter <= c.maxtot) loop
                    910:
                    911:       Predictor(s,p,sa,prev_sa,t,prev_t,target,step,tol,dist_sols,trial);
                    912:       Correct(s,pivot,dist_sols,c,fail); Copy(s,sa);
                    913:       success := not fail;
                    914:       Linear_Multiple_Management(s,sa,old_sa,prev_sa,t,old_t,prev_t,p,step,
                    915:                                  pivot,nsuccess,trial,success);
                    916:       if step < p.minstep then return; end if;
                    917:     end loop;
                    918:     declare
                    919:       cp : Corr_Pars := End_Game_Corrector_Parameters(c,p.dist_target,tol);
                    920:     begin
                    921:       Correct(s,pivot,dist_sols,cp,fail);
                    922:     end;
                    923:   end Linear_Multiple_Conditioned_Silent_Continue;
                    924:
                    925:   procedure Linear_Multiple_Conditioned_Reporting_Continue
                    926:               ( file : in file_type; s : in out Solu_Info_Array;
                    927:                 target : in Complex_Number; tol,dist_sols : in double_float;
                    928:                 proj : in boolean; p : in Pred_Pars; c : in Corr_Pars ) is
                    929:
                    930:     t,old_t,prev_t : Complex_Number;
                    931:     sa,old_sa,prev_sa : Solution_Array(s'range);
                    932:     step : double_float := p.maxstep;
                    933:     pivot : natural := s'first;
                    934:     cnt,nsuccess,trial : natural := 0;
                    935:     success,fail : boolean := true;
                    936:
                    937:     procedure Predictor is new Multiple_Predictor(Norm,dH,dH);
                    938:
                    939:     procedure Affine_Corrector is
                    940:       new Affine_Multiple_Loose_Conditioned_Reporting_Corrector(Norm,H,dH);
                    941:     procedure Projective_Corrector is
                    942:       new Projective_Multiple_Loose_Conditioned_Reporting_Corrector(Norm,H,dH);
                    943:
                    944:     procedure Correct ( file : in file_type; s : in out Solu_Info_Array;
                    945:                         pivot : in out natural; dist_sols : in double_float;
                    946:                         c : in Corr_Pars; fail : out boolean ) is
                    947:     begin
                    948:       Copy(sa,s);
                    949:       if proj
                    950:        then Projective_Corrector(file,s,pivot,dist_sols,c,fail);
                    951:        else Affine_Corrector(file,s,pivot,dist_sols,c,fail);
                    952:       end if;
                    953:     end Correct;
                    954:
                    955:   begin
                    956:     Linear_Multiple_Initialize(s,p,t,old_t,prev_t,sa,old_sa,prev_sa);
                    957:     for k in s'range loop                        -- write start solutions
                    958:       sWrite(file,sa(k).all);
                    959:     end loop;
                    960:     while not (At_End(t,target,p.dist_target,tol) and success)
                    961:                             and (s(s'first).niter <= c.maxtot) loop
                    962:
                    963:       Predictor(s,p,sa,prev_sa,t,prev_t,target,step,tol,dist_sols,trial);
                    964:       pWrite(file,step,t);
                    965:       Correct(file,s,pivot,dist_sols,c,fail); Copy(s,sa);
                    966:       success := not fail;
                    967:       Linear_Multiple_Management(s,sa,old_sa,prev_sa,t,old_t,prev_t,p,step,
                    968:                                  pivot,nsuccess,trial,success);
                    969:       if step < p.minstep then return; end if;
                    970:     end loop;
                    971:     declare
                    972:       cp : Corr_Pars := End_Game_Corrector_Parameters(c,p.dist_target,tol);
                    973:     begin
                    974:       Correct(file,s,pivot,dist_sols,cp,fail);
                    975:     end;
                    976:   end Linear_Multiple_Conditioned_Reporting_Continue;
                    977:
                    978: -- CIRCULAR PATH FOLLOWING FOR ONE PATH :
                    979:
                    980:   procedure Circular_Single_Normal_Reporting_Continue
                    981:               ( file : in file_type; s : in out Solu_Info;
                    982:                 target : in Complex_Number; tol,epslop : in double_float;
                    983:                 wc : out natural; max_wc : in natural; sum,all_sum : out Vector;
                    984:                 proj : in boolean; p : in Pred_Pars; c : in Corr_Pars ) is
                    985:
                    986:     old_t,prev_t : Complex_Number;
                    987:     t0_min_target : Complex_Number := s.sol.t - target;
                    988:     theta,old_theta : double_float := 0.0;
                    989:     twopi : constant double_float := 2.0*PI;
                    990:     step : double_float := twopi*p.maxstep;
                    991:     old_solution,prev_solution,start_solution : Vector(s.sol.v'range);
                    992:     w_c,nsuccess : natural := 0;
                    993:     success : boolean := true;
                    994:     stop : boolean := false;
                    995:     w_sum,w_all_sum : Vector(s.sol.v'range) := Create(0.5)*s.sol.v;
                    996:     n_sum,n_all_sum : natural := 0;
                    997:
                    998:     procedure T_C_Predictor is new Tangent_Circular_Predictor(Norm,dH,dH);
                    999:
                   1000:     procedure Affine_Corrector is
                   1001:       new Affine_Single_Severe_Normal_Reporting_Corrector(Norm,H,dH);
                   1002:     procedure Projective_Corrector is
                   1003:       new Projective_Single_Severe_Normal_Reporting_Corrector(Norm,H,dH);
                   1004:
                   1005:   begin
                   1006:     old_t := s.sol.t; old_solution := s.sol.v;        -- INITIALIZATION
                   1007:     start_solution := s.sol.v;
                   1008:     if p.predictor_type = 0
                   1009:      then prev_t := s.sol.t; prev_solution := s.sol.v;
                   1010:     end if;
                   1011:     sWrite(file,s.sol.all);                -- write the start solution
                   1012:     while (s.niter <= c.maxtot) loop
                   1013:       case p.predictor_type is
                   1014:         when 0 => Secant_Circular_Predictor(s.sol.v,prev_solution,s.sol.t,theta,
                   1015:                                     prev_t,t0_min_target,target,step,tol);
                   1016:         when 2 => T_C_Predictor(s.sol.v,s.sol.t,theta, t0_min_target,target,
                   1017:                                 step,tol);
                   1018:                   s.nsyst := s.nsyst + 1;
                   1019:         when others => null; -- these choices make no sense !!!
                   1020:       end case;
                   1021:       pWrite(file,step,s.sol.t,s.sol.all);
                   1022:       if proj
                   1023:        then Projective_Corrector(file,s,c);
                   1024:        else Affine_Corrector(file,s,c);
                   1025:       end if;
                   1026:       sWrite(file,s.sol.all);
                   1027:       Circular_Management
                   1028:            (s,p,c,old_t,prev_t,start_solution,old_solution,prev_solution,
                   1029:             w_sum,w_all_sum,twopi,epslop,tol,theta,old_theta,
                   1030:             step,nsuccess,n_sum,n_all_sum,w_c,max_wc,stop,success);
                   1031:       exit when stop;
                   1032:       if step < p.minstep then return; end if;
                   1033:     end loop;
                   1034:     wc := w_c;
                   1035:     if n_all_sum /= 0
                   1036:      then all_sum := w_all_sum*Create(1.0/double_float(n_all_sum));
                   1037:     end if;
                   1038:     if n_sum /= 0
                   1039:      then sum := w_sum*Create(1.0/double_float(n_sum));
                   1040:      elsif n_all_sum /= 0
                   1041:          then all_sum := w_all_sum*Create(1.0/double_float(n_all_sum));
                   1042:     end if;
                   1043:   end Circular_Single_Normal_Reporting_Continue;
                   1044:
                   1045:   procedure Circular_Single_Conditioned_Reporting_Continue
                   1046:               ( file : in file_type; s : in out Solu_Info;
                   1047:                 target : in Complex_Number; tol,epslop : in double_float;
                   1048:                 wc : out natural; max_wc : in natural; sum,all_sum : out Vector;
                   1049:                 proj : in boolean; p : in Pred_Pars; c : in Corr_Pars ) is
                   1050:
                   1051:     old_t,prev_t : Complex_Number;
                   1052:     theta,old_theta : double_float := 0.0;
                   1053:     twopi : constant double_float := 2.0*PI;
                   1054:     step : double_float := twopi*p.maxstep;
                   1055:     t0_min_target : Complex_Number := s.sol.t - target;
                   1056:     old_solution,prev_solution,start_solution : Vector(s.sol.v'range);
                   1057:     w_c,nsuccess : natural := 0;
                   1058:     success : boolean := true;
                   1059:     stop : boolean := false;
                   1060:     w_sum,w_all_sum : Vector(s.sol.v'range) := Create(0.5)*s.sol.v;
                   1061:     n_sum,n_all_sum : natural := 0;
                   1062:
                   1063:     procedure T_C_Predictor is new Tangent_Circular_Predictor(Norm,dH,dH);
                   1064:
                   1065:     procedure Affine_Corrector is
                   1066:       new Affine_Single_Severe_Conditioned_Reporting_Corrector(Norm,H,dH);
                   1067:     procedure Projective_Corrector is
                   1068:       new Projective_Single_Severe_Conditioned_Reporting_Corrector(Norm,H,dH);
                   1069:
                   1070:   begin
                   1071:     old_t := s.sol.t; old_solution := s.sol.v;            -- INITIALIZATION
                   1072:     start_solution := s.sol.v;
                   1073:     if p.predictor_type = 0
                   1074:      then prev_t := s.sol.t; prev_solution := old_solution;
                   1075:     end if;
                   1076:     sWrite(file,s.sol.all);              -- writing the start solution
                   1077:     while s.niter <= c.maxtot loop
                   1078:       case p.predictor_type is
                   1079:         when 0 => Secant_Circular_Predictor(s.sol.v,prev_solution,s.sol.t,theta,
                   1080:                                     prev_t,t0_min_target,target,step,tol);
                   1081:         when 2 => T_C_Predictor(s.sol.v,s.sol.t,theta,t0_min_target,
                   1082:                                 target,step,tol);
                   1083:                   s.nsyst := s.nsyst + 1;
                   1084:         when others => null; -- these choices make no sense !!!
                   1085:       end case;
                   1086:       pWrite(file,step,s.sol.t,s.sol.all);
                   1087:       if proj
                   1088:        then Projective_Corrector(file,s,c);
                   1089:        else Affine_Corrector(file,s,c);
                   1090:       end if;
                   1091:       sWrite(file,s.sol.all);
                   1092:       Circular_Management
                   1093:           (s,p,c,old_t,prev_t,start_solution,old_solution,prev_solution,
                   1094:            w_sum,w_all_sum,twopi,epslop,tol,theta,old_theta,
                   1095:            step,nsuccess,n_sum,n_all_sum,w_c,max_wc,stop,success);
                   1096:       exit when stop;
                   1097:       if step < p.minstep then return; end if;
                   1098:     end loop;
                   1099:     wc := w_c;
                   1100:     if n_all_sum /= 0
                   1101:      then all_sum := w_all_sum*Create(1.0/double_float(n_all_sum));
                   1102:     end if;
                   1103:     if n_sum /= 0
                   1104:      then sum := w_sum*Create(1.0/double_float(n_sum));
                   1105:      elsif n_all_sum /= 0
                   1106:          then sum := w_all_sum*Create(1.0/double_float(n_all_sum));
                   1107:     end if;
                   1108:   end Circular_Single_Conditioned_Reporting_Continue;
                   1109:
                   1110: end Path_Trackers;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>