Annotation of OpenXM_contrib/PHC/Ada/Continuation/increment_and_fix_continuation.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_Complex_Solutions_io; use Standard_Complex_Solutions_io;
5: with Path_Trackers; use Path_Trackers;
6: with Continuation_Parameters; use Continuation_Parameters;
7: with Continuation_Data; use Continuation_Data;
8:
9: package body Increment_and_Fix_Continuation is
10:
11: -- AUXILIAIRIES :
12:
13: function At_Infinity ( s : Solution; proj : boolean ) return boolean is
14:
15: -- DESCRIPTION :
16: -- Decides whether a given solution lies at infinity.
17:
18: begin
19: if proj
20: then if AbsVal(s.v(s.v'last)) < 1.0/tol_endg_at_infinity
21: then return true;
22: else return false;
23: end if;
24: else for i in 1..s.n loop
25: if AbsVal(s.v(i)) > tol_endg_at_infinity
26: then return true;
27: end if;
28: end loop;
29: return false;
30: end if;
31: end At_Infinity;
32:
33: function Equals ( s : in Solu_Info_Array; x : in Vector; i : in natural;
34: d : in double_float; proj : in boolean ) return natural is
35:
36: -- DESCRIPTION :
37: -- Returns the index j in the solution array s(s'first..i) of the
38: -- solution which equals x.
39:
40: eq : boolean := false;
41: j : natural := s'first;
42:
43: begin
44: while j < i loop
45: if not At_Infinity(s(j).sol.all,proj)
46: then eq := true;
47: if proj
48: then for k in x'range loop
49: if AbsVal(s(j).sol.v(k)/s(j).sol.v(x'last)
50: - x(k)/x(x'last)) > d
51: then eq := false; exit;
52: end if;
53: end loop;
54: else for k in x'range loop
55: if AbsVal(s(j).sol.v(k) - x(k)) > d
56: then eq := false; exit;
57: end if;
58: end loop;
59: end if;
60: end if;
61: exit when eq;
62: j := j + 1;
63: end loop;
64: return j;
65: end Equals;
66:
67: procedure Add_Clustered ( i,n : in natural; sols : in Solution_List;
68: clusols : in out Solution_List ) is
69:
70: -- DESCRIPTION :
71: -- Adds the ith start solution to the list clusols.
72: -- The multiplicity of the solution equals i.
73:
74: s : Solution(n) := Get(sols,i);
75: tol : constant double_float := 10.0**(-12);
76:
77: begin
78: if not Is_In(clusols,s,tol)
79: then s.m := i;
80: Add(clusols,s);
81: end if;
82: end Add_Clustered;
83:
84: procedure Write_Bar ( file : in file_type ) is
85: begin
86: put(file,"========================================");
87: put_line(file,"===================================");
88: end Write_Bar;
89:
90: procedure Write_Statistics ( file : in file_type;
91: i,nstep,nfail,niter,nsyst : in natural ) is
92:
93: -- DESCRIPTION :
94: -- Writes the computing statistics of the ith path on file.
95:
96: begin
97: put(file,"== "); put(file,i,1); put(file," = ");
98: put(file," #step : "); put(file,nstep,3);
99: put(file," #fail : "); put(file,nfail,2);
100: put(file," #iter : "); put(file,niter,3);
101: if nsyst /= niter
102: then put(file," #syst : "); put(file,nsyst,3);
103: end if;
104: put(file," = ");
105: end Write_Statistics;
106:
107: procedure Write_Diagnostics
108: ( file : in file_type; s : in out Solu_Info_Array;
109: c : in Corr_Pars; tol : in double_float; i : in natural;
110: proj : in boolean;
111: ninfi,nregu,nsing,nclus,nfail : in out natural;
112: sols : in Solution_List; clusols : in out Solution_List ) is
113:
114: -- DESCRIPTION :
115: -- Writes the diagnostics for the ith solution.
116: -- If it is a clustered solution, then the corresponding start solution
117: -- will be added from the list sols to the list clusols.
118:
119: j : natural;
120:
121: begin
122: if At_Infinity(s(i).sol.all,proj)
123: then ninfi := ninfi + 1;
124: put_line(file,"at infinity ==");
125: elsif ((s(i).cora <= c.epsax) or else (s(i).resa <= c.epsaf)
126: or else (s(i).corr <= c.epsrx) or else (s(i).resr <= c.epsrf))
127: then j := Equals(s,s(i).sol.v,i,tol,proj);
128: if j = i
129: then if s(i).rcond > tol_endg_inverse_condition
130: then nregu := nregu + 1;
131: put_line(file,"regular solution ==");
132: else nsing := nsing + 1;
133: put_line(file,"singular solution ==");
134: end if;
135: elsif s(i).rcond < tol_endg_inverse_condition
136: then nsing := nsing + 1;
137: s(j).sol.m := s(j).sol.m + 1;
138: s(i).sol.m := s(i).sol.m + 1;
139: put(file,"multiple, see ");
140: put(file,j,1); put_line(file," ==");
141: else nclus := nclus + 1;
142: put(file,"clustered with ");
143: put(file,j,1); put_line(file," ==");
144: Add_Clustered(i,s(i).sol.n,sols,clusols);
145: Add_Clustered(j,s(j).sol.n,sols,clusols);
146: end if;
147: elsif s(i).rcond < tol_endg_inverse_condition
148: then nfail := nfail + 1;
149: put_line(file,"failure ==");
150: else nfail := nfail + 1;
151: put_line(file,"failure ==");
152: end if;
153: end Write_Diagnostics;
154:
155: procedure Write_Solution ( file : in file_type; s : in Solu_Info ) is
156:
157: -- DESCRIPTION :
158: -- Writes the solution and the length of the path on file.
159:
160: begin
161: put(file,"t : "); put(file,s.sol.t); new_line(file);
162: put(file,"m : "); put(file,s.sol.m,1);
163: put(file," Length of path : ");
164: put(file,s.length_path);
165: new_line(file);
166: put_line(file,"the solution for t : ");
167: put_vector(file,s.sol.all);
168: put(file,"==");
169: put(file," err : "); put(file,s.cora,2,3,3); put(file," =");
170: put(file," rco : "); put(file,s.rcond,2,3,3); put(file," =");
171: put(file," res : "); put(file,s.resa,2,3,3); put_line(file," ==");
172: end Write_Solution;
173:
174: procedure Diagnostics
175: ( s : in out Solu_Info_Array; c : in Corr_Pars;
176: tol : in double_float;i : in natural; proj : in boolean;
177: ninfi,nregu,nsing,nclus,nfail : in out natural;
178: sols : in Solution_List; clusols : in out Solution_List ) is
179:
180: -- DESCRIPTION :
181: -- Analyzes the ith solution. If it is a clustered solution, then the
182: -- corresponding start solution from the list sols will be added to the
183: -- list clusols.
184:
185: j : natural;
186:
187: begin
188: if At_Infinity(s(i).sol.all,proj)
189: then ninfi := ninfi + 1;
190: elsif ((s(i).cora <= c.epsax) or else (s(i).resa <= c.epsaf)
191: or else (s(i).corr <= c.epsrx) or else (s(i).resr <= c.epsrf))
192: then j := Equals(s,s(i).sol.v,i,tol,proj);
193: if j = i
194: then if s(i).rcond > tol_endg_inverse_condition
195: then nregu := nregu + 1;
196: else nsing := nsing + 1;
197: end if;
198: elsif s(i).rcond < tol_endg_inverse_condition
199: then nsing := nsing + 1;
200: s(j).sol.m := s(j).sol.m + 1;
201: s(i).sol.m := s(i).sol.m + 1;
202: else nclus := nclus + 1;
203: Add_Clustered(i,s(i).sol.n,sols,clusols);
204: Add_Clustered(j,s(j).sol.n,sols,clusols);
205: end if;
206: elsif s(i).rcond < tol_endg_inverse_condition
207: then nfail := nfail + 1;
208: else nfail := nfail + 1;
209: end if;
210: end Diagnostics;
211:
212: procedure Write_Summary_Diagnostics
213: ( file : in file_type;
214: ninfi,nregu,nsing,nfail,nclus : in natural ) is
215:
216: -- DESCRIPTION :
217: -- Writes a summary after the continuation.
218:
219: begin
220: put(file,"== ");
221: put(file,"#regu : "); put(file,nregu,1); put(file," = " );
222: put(file,"#sing : "); put(file,nsing,1); put(file," = " );
223: put(file,"#clus : "); put(file,nclus,1); put(file," = " );
224: put(file,"#infi : "); put(file,ninfi,1); put(file," = " );
225: put(file,"#fail : "); put(file,nfail,1);
226: put_line(file," == " );
227: end Write_Summary_Diagnostics;
228:
229: procedure Merge_Clustered
230: ( s : in out Solu_Info_Array; clusols : in Solution_List ) is
231:
232: -- DESCRIPTION :
233: -- The new solutions, which were clustered before, are merged with
234: -- the solution array, by using there multiplicity.
235:
236: tmp : Solution_List := clusols;
237: ls : Link_to_Solution;
238:
239: begin
240: while not Is_Null(tmp) loop
241: ls := Head_Of(tmp);
242: s(ls.m).sol := new Solution'(ls.all);
243: tmp := Tail_Of(tmp);
244: end loop;
245: end Merge_Clustered;
246:
247: -- TARGET ROUTINES :
248:
249: procedure Silent_Continue
250: ( sols : in out Solution_List; proj : in boolean;
251: target : in Complex_Number := Create(1.0) ) is
252:
253: sia : Solu_Info_Array(1..Length_Of(sols)) := Deep_Create(sols);
254: ppa,pen : Pred_Pars;
255: cpa,cen : Corr_Pars;
256: tol : constant double_float := 10.0**(-10);
257: dumv : Standard_Floating_Vectors.Link_to_Vector;
258: err : double_float;
259:
260: procedure LCont1 is
261: new Linear_Single_Normal_Silent_Continue(Norm,H,dH,dH);
262: procedure LCont2 is
263: new Linear_Single_Conditioned_Silent_Continue(Norm,H,dH,dH);
264: procedure LContN1 is
265: new Linear_Multiple_Normal_Silent_Continue(Norm,H,dH,dH);
266:
267: procedure Rerun_Clustered
268: ( s : in out Solu_Info_Array;
269: clusols : in out Solution_List ) is
270:
271: oldmax : natural := max_reruns;
272: oldblk : natural := block_size;
273:
274: begin
275: condition := condition + 1;
276: Continuation_Parameters.Tune(condition);
277: max_reruns := oldmax - 1;
278: block_size := Length_Of(clusols);
279: Silent_Continue(clusols,proj,target);
280: block_size := oldblk;
281: Merge_Clustered(s,clusols);
282: Deep_Clear(clusols);
283: end Rerun_Clustered;
284:
285: procedure Sequential_Continue
286: ( s : in out Solu_Info_Array;
287: target : in Complex_Number; tol : in double_float;
288: p1,p2 : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
289:
290: ninfi,nregu,nsing,nfail,nclus : natural := 0;
291: clusols : Solution_List;
292:
293: begin
294: for i in s'range loop
295: LCont1(s(i),target,tol,proj,p1,c_path);
296: LCont2(s(i),target,tol,proj,0,dumv,err,p2,c_end);
297: Diagnostics(s,c_end,tol,i,proj,
298: ninfi,nregu,nsing,nclus,nfail,sols,clusols);
299: end loop;
300: if (nclus > 0) and then (max_reruns > 0)
301: then Rerun_Clustered(s,clusols);
302: end if;
303: end Sequential_Continue;
304:
305: procedure Continue_End_Game
306: ( s : in out Solu_Info_Array;
307: target : in Complex_Number; tol : in double_float;
308: p : in Pred_Pars; c : in Corr_Pars ) is
309:
310: -- DESCRIPTION :
311: -- End game for the simultaneous path following.
312:
313: ninfi,nregu,nsing,nfail,nclus : natural := 0;
314: clusols : Solution_List;
315:
316: begin
317: for i in s'range loop
318: LCont2(s(i),target,tol,proj,0,dumv,err,p,c);
319: end loop;
320: for i in s'range loop
321: Diagnostics(s,c,tol,i,proj,ninfi,nregu,nsing,nclus,nfail,sols,clusols);
322: end loop;
323: if (nclus > 0) and then (max_reruns > 0)
324: then Rerun_Clustered(s,clusols);
325: end if;
326: end Continue_end_Game;
327:
328: procedure Parallel_Continue
329: ( s : in out Solu_Info_Array;
330: target : in Complex_Number; tol : in double_float;
331: p_path,p_end : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
332:
333: -- DESCRIPTION :
334: -- This procedure implements the simultaneous continuation of
335: -- different solution paths.
336:
337: ninfi,nregu,nsing,nfail,nclus : natural := 0;
338: nb,index : natural;
339: blck : natural := block_size;
340:
341: begin
342: nb := 1; index := 0;
343: while index < s'last loop
344: if blck > s'last - index
345: then blck := s'last - index;
346: end if;
347: declare
348: sbk : Solu_Info_Array(1..blck) := s(index+1..index+blck);
349: begin
350: LContN1(sbk,target,tol,tol_path_distance,proj,p_path,c_path);
351: Continue_end_Game(sbk,target,tol,p_end,c_end);
352: s(index+1..index+blck) := sbk;
353: end;
354: nb := nb + 1;
355: index := index + blck;
356: end loop;
357: end Parallel_Continue;
358:
359: begin
360: ppa := Continuation_Parameters.Create_for_Path;
361: pen := Continuation_Parameters.Create_End_Game;
362: cpa := Continuation_Parameters.Create_for_Path;
363: cen := Continuation_Parameters.Create_End_Game;
364: if block_size = 1
365: then Sequential_Continue(sia,target,tol,ppa,pen,cpa,cen);
366: else Parallel_Continue(sia,target,tol,ppa,pen,cpa,cen);
367: end if;
368: Deep_Clear(sols);
369: sols := Shallow_Create(sia);
370: end Silent_Continue;
371:
372: procedure Reporting_Continue
373: ( file : in file_type; sols : in out Solution_List;
374: proj : in boolean;
375: target : in Complex_Number := Create(1.0) ) is
376:
377: sia : Solu_Info_Array(1..Length_Of(sols)) := Deep_Create(sols);
378: ppa,pen : Pred_Pars;
379: cpa,cen : Corr_Pars;
380: tol : constant double_float := 10.0**(-10);
381: dumv : Standard_Floating_Vectors.Link_to_Vector;
382: err : double_float;
383:
384: procedure LCont1 is
385: new Linear_Single_Normal_Reporting_Continue(Norm,H,dH,dH);
386: procedure LCont2 is
387: new Linear_Single_Conditioned_Reporting_Continue(Norm,H,dH,dH);
388: procedure LContN1 is
389: new Linear_Multiple_Normal_Reporting_Continue(Norm,H,dH,dH);
390: procedure CCont2 is
391: new Circular_Single_Conditioned_Reporting_Continue(Norm,H,dH,dH);
392:
393: procedure Rerun_Clustered
394: ( file : in file_type; s : in out Solu_Info_Array;
395: clusols : in out Solution_List ) is
396:
397: oldmax : natural := max_reruns;
398: oldblk : natural := block_size;
399:
400: begin
401: condition := condition + 1;
402: Continuation_Parameters.Tune(condition);
403: max_reruns := oldmax - 1;
404: block_size := Length_Of(clusols);
405: Reporting_Continue(file,clusols,proj,target);
406: block_size := oldblk;
407: Merge_Clustered(s,clusols);
408: Deep_Clear(clusols);
409: end Rerun_Clustered;
410:
411: procedure Sequential_Continue
412: ( file : in file_type; s : in out Solu_Info_Array;
413: target : in Complex_Number; tol : in double_float;
414: p1,p2 : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
415:
416: ninfi,nregu,nsing,nfail,nclus : natural := 0;
417: clusols : Solution_List;
418:
419: begin
420: Write_Bar(file);
421: for i in s'range loop
422: LCont1(file,s(i),target,tol,proj,p1,c_path);
423: LCont2(file,s(i),target,tol,proj,0,dumv,err,p2,c_end);
424: Write_Statistics(file,i,s(i).nstep,s(i).nfail,s(i).niter,s(i).nsyst);
425: Write_Diagnostics(file,s,c_end,tol,i,proj,
426: ninfi,nregu,nsing,nclus,nfail,sols,clusols);
427: Write_Solution(file,s(i));
428: end loop;
429: Write_Summary_Diagnostics(file,ninfi,nregu,nsing,nfail,nclus);
430: if (nclus > 0) and then (max_reruns > 0)
431: then Rerun_Clustered(file,s,clusols);
432: end if;
433: end Sequential_Continue;
434:
435: procedure Continue_End_Game
436: ( file : in file_type; s : in out Solu_Info_Array;
437: target : in Complex_Number; tol : in double_float;
438: p : in Pred_Pars; c : in Corr_Pars ) is
439:
440: ninfi,nregu,nsing,nfail,nclus : natural := 0;
441: clusols : Solution_List;
442:
443: begin
444: for i in s'range loop
445: LCont2(file,s(i),target,tol,proj,0,dumv,err,p,c);
446: end loop;
447: Write_Bar(file);
448: for i in s'range loop
449: Write_Statistics(file,i,s(i).nstep,s(i).nfail,s(i).niter,s(i).nsyst);
450: Write_Diagnostics(file,s,c,tol,i,proj,
451: ninfi,nregu,nsing,nclus,nfail,sols,clusols);
452: Write_Solution(file,s(i));
453: end loop;
454: put_line(file,"The computed solutions :");
455: declare
456: solus : Solution_List := Deep_Create(s);
457: begin
458: put(file,solus); Deep_Clear(solus);
459: end;
460: Write_Summary_Diagnostics(file,ninfi,nregu,nsing,nfail,nclus);
461: if (nclus > 0) and then (max_reruns > 0)
462: then Rerun_Clustered(file,s,clusols);
463: end if;
464: end Continue_end_Game;
465:
466: procedure Parallel_Continue
467: ( file : in file_type; s : in out Solu_Info_Array;
468: target : in Complex_Number; tol : in double_float;
469: p_path,p_end : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
470:
471: -- DESCRIPTION :
472: -- This procedure implements the simultaneous continuation of
473: -- different solution paths.
474:
475: ninfi,nregu,nsing,nfail,nclus : natural := 0;
476: nb,index : natural;
477: blck : natural := block_size;
478:
479: begin
480: nb := 1; index := 0;
481: while index < s'last loop
482: if blck > s'last - index
483: then blck := s'last - index;
484: end if;
485: declare
486: sbk : Solu_Info_Array(1..blck) := s(index+1..index+blck);
487: begin
488: LContN1(file,sbk,target,tol,tol_path_distance,proj,p_path,c_path);
489: Continue_end_Game(file,sbk,target,tol,p_end,c_end);
490: s(index+1..index+blck) := sbk;
491: end;
492: nb := nb + 1;
493: index := index + blck;
494: end loop;
495: end Parallel_Continue;
496:
497: begin
498: ppa := Continuation_Parameters.Create_for_Path;
499: pen := Continuation_Parameters.Create_End_Game;
500: cpa := Continuation_Parameters.Create_for_Path;
501: cen := Continuation_Parameters.Create_End_Game;
502: if block_size = 1
503: then Sequential_Continue(file,sia,target,tol,ppa,pen,cpa,cen);
504: else Parallel_Continue(file,sia,target,tol,ppa,pen,cpa,cen);
505: end if;
506: Deep_Clear(sols);
507: sols := Shallow_Create(sia);
508: end Reporting_Continue;
509:
510: -- CONTINUATION WITH ESTIMATION OF PATH DIRECTIONS :
511:
512: procedure Silent_Toric_Continue
513: ( sols : in out Solution_List; proj : in boolean;
514: v : in out VecVec;
515: errv : in out Standard_Floating_Vectors.Vector;
516: target : in Complex_Number := Create(1.0) ) is
517:
518: rtoric : natural := Continuation_Parameters.endext_order;
519: sia : Solu_Info_Array(1..Length_Of(sols)) := Deep_Create(sols);
520: ppa,pen : Pred_Pars;
521: cpa,cen : Corr_Pars;
522: tol : constant double_float := 10.0**(-10);
523:
524: procedure LCont1 is
525: new Linear_Single_Normal_Silent_Continue(Norm,H,dH,dH);
526: procedure LCont2 is
527: new Linear_Single_Conditioned_Silent_Continue(Norm,H,dH,dH);
528: procedure LContN1 is
529: new Linear_Multiple_Normal_Silent_Continue(Norm,H,dH,dH);
530:
531: procedure Rerun_Clustered
532: ( s : in out Solu_Info_Array;
533: clusols : in out Solution_List ) is
534:
535: oldmax : natural := max_reruns;
536: oldblk : natural := block_size;
537:
538: begin
539: condition := condition + 1;
540: Continuation_Parameters.Tune(condition);
541: max_reruns := oldmax - 1;
542: block_size := Length_Of(clusols);
543: Silent_Toric_Continue(clusols,proj,v,errv,target);
544: block_size := oldblk;
545: Merge_Clustered(s,clusols);
546: Deep_Clear(clusols);
547: end Rerun_Clustered;
548:
549: procedure Sequential_Continue
550: ( s : in out Solu_Info_Array;
551: target : in Complex_Number; tol : in double_float;
552: p1,p2 : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
553:
554: ninfi,nregu,nsing,nfail,nclus : natural := 0;
555: clusols : Solution_List;
556:
557: begin
558: for i in s'range loop
559: LCont1(s(i),target,tol,proj,p1,c_path);
560: LCont2(s(i),target,tol,proj,rtoric,v(i),errv(i),p2,c_end);
561: Diagnostics(s,c_end,tol,i,proj,
562: ninfi,nregu,nsing,nclus,nfail,sols,clusols);
563: end loop;
564: if (nclus > 0) and then (max_reruns > 0)
565: then Rerun_Clustered(s,clusols);
566: end if;
567: end Sequential_Continue;
568:
569: procedure Continue_End_Game
570: ( s : in out Solu_Info_Array;
571: target : in Complex_Number; tol : in double_float;
572: p : in Pred_Pars; c : in Corr_Pars ) is
573:
574: ninfi,nregu,nsing,nfail,nclus : natural := 0;
575: clusols : Solution_List;
576:
577: begin
578: for i in s'range loop
579: LCont2(s(i),target,tol,proj,rtoric,v(i),errv(i),p,c);
580: end loop;
581: for i in s'range loop
582: Diagnostics(s,c,tol,i,proj,ninfi,nregu,nsing,nclus,nfail,sols,clusols);
583: end loop;
584: if (nclus > 0) and then (max_reruns > 0)
585: then Rerun_Clustered(s,clusols);
586: end if;
587: end Continue_end_Game;
588:
589: procedure Parallel_Continue
590: ( s : in out Solu_Info_Array;
591: target : in Complex_Number; tol : in double_float;
592: p_path,p_end : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
593:
594: -- DESCRIPTION :
595: -- This procedure implements the simultaneous continuation of
596: -- different solution paths.
597:
598: ninfi,nregu,nsing,nfail,nclus : natural := 0;
599: nb,index : natural;
600: blck : natural := block_size;
601:
602: begin
603: nb := 1; index := 0;
604: while index < s'last loop
605: if blck > s'last - index
606: then blck := s'last - index;
607: end if;
608: declare
609: sbk : Solu_Info_Array(1..blck) := s(index+1..index+blck);
610: begin
611: LContN1(sbk,target,tol,tol_path_distance,proj,p_path,c_path);
612: Continue_end_Game(sbk,target,tol,p_end,c_end);
613: s(index+1..index+blck) := sbk;
614: end;
615: nb := nb + 1;
616: index := index + blck;
617: end loop;
618: end Parallel_Continue;
619:
620: begin
621: ppa := Continuation_Parameters.Create_for_Path;
622: pen := Continuation_Parameters.Create_End_Game;
623: cpa := Continuation_Parameters.Create_for_Path;
624: cen := Continuation_Parameters.Create_End_Game;
625: if block_size = 1
626: then Sequential_Continue(sia,target,tol,ppa,pen,cpa,cen);
627: else Parallel_Continue(sia,target,tol,ppa,pen,cpa,cen);
628: end if;
629: Deep_Clear(sols);
630: sols := Shallow_Create(sia);
631: end Silent_Toric_Continue;
632:
633: procedure Reporting_Toric_Continue
634: ( file : in file_type; sols : in out Solution_List;
635: proj : in boolean; v : in out VecVec;
636: errv : in out Standard_Floating_Vectors.Vector;
637: target : in Complex_Number := Create(1.0) ) is
638:
639: rtoric : natural := Continuation_Parameters.endext_order;
640: sia : Solu_Info_Array(1..Length_Of(sols)) := Deep_Create(sols);
641: ppa,pen : Pred_Pars;
642: cpa,cen : Corr_Pars;
643: tol : constant double_float := 10.0**(-10);
644:
645: procedure LCont1 is
646: new Linear_Single_Normal_Reporting_Continue(Norm,H,dH,dH);
647: procedure LCont2 is
648: new Linear_Single_Conditioned_Reporting_Continue(Norm,H,dH,dH);
649: procedure LContN1 is
650: new Linear_Multiple_Normal_Reporting_Continue(Norm,H,dH,dH);
651: procedure CCont2 is
652: new Circular_Single_Conditioned_Reporting_Continue(Norm,H,dH,dH);
653:
654: procedure Rerun_Clustered
655: ( file : in file_type; s : in out Solu_Info_Array;
656: clusols : in out Solution_List ) is
657:
658: oldmax : natural := max_reruns;
659: oldblk : natural := block_size;
660:
661: begin
662: condition := condition + 1;
663: Continuation_Parameters.Tune(condition);
664: max_reruns := oldmax - 1;
665: block_size := Length_Of(clusols);
666: Reporting_Toric_Continue(file,clusols,proj,v,errv,target);
667: block_size := oldblk;
668: Merge_Clustered(s,clusols);
669: Deep_Clear(clusols);
670: end Rerun_Clustered;
671:
672: procedure Sequential_Continue
673: ( file : in file_type; s : in out Solu_Info_Array;
674: target : in Complex_Number; tol : in double_float;
675: p1,p2 : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
676:
677: ninfi,nregu,nsing,nfail,nclus : natural := 0;
678: clusols : Solution_List;
679:
680: begin
681: Write_Bar(file);
682: for i in s'range loop
683: LCont1(file,s(i),target,tol,proj,p1,c_path);
684: LCont2(file,s(i),target,tol,proj,rtoric,v(i),errv(i),p2,c_end);
685: Write_Statistics(file,i,s(i).nstep,s(i).nfail,s(i).niter,s(i).nsyst);
686: Write_Diagnostics(file,s,c_end,tol,i,proj,
687: ninfi,nregu,nsing,nclus,nfail,sols,clusols);
688: Write_Solution(file,s(i));
689: end loop;
690: Write_Summary_Diagnostics(file,ninfi,nregu,nsing,nfail,nclus);
691: if (nclus > 0) and then (max_reruns > 0)
692: then Rerun_Clustered(file,s,clusols);
693: end if;
694: end Sequential_Continue;
695:
696: procedure Continue_End_Game
697: ( file : in file_type; s : in out Solu_Info_Array;
698: target : in Complex_Number; tol : in double_float;
699: p : in Pred_Pars; c : in Corr_Pars ) is
700:
701: ninfi,nregu,nsing,nfail,nclus : natural := 0;
702: clusols : Solution_List;
703:
704: begin
705: for i in s'range loop
706: LCont2(file,s(i),target,tol,proj,rtoric,v(i),errv(i),p,c);
707: end loop;
708: Write_Bar(file);
709: for i in s'range loop
710: Write_Statistics(file,i,s(i).nstep,s(i).nfail,s(i).niter,s(i).nsyst);
711: Write_Diagnostics(file,s,c,tol,i,proj,
712: ninfi,nregu,nsing,nclus,nfail,sols,clusols);
713: Write_Solution(file,s(i));
714: end loop;
715: put_line(file,"The computed solutions :");
716: declare
717: solus : Solution_List := Deep_Create(s);
718: begin
719: put(file,solus); Deep_Clear(solus);
720: end;
721: Write_Summary_Diagnostics(file,ninfi,nregu,nsing,nfail,nclus);
722: if (nclus > 0) and then (max_reruns > 0)
723: then Rerun_Clustered(file,s,clusols);
724: end if;
725: end Continue_end_Game;
726:
727: procedure Parallel_Continue
728: ( file : in file_type; s : in out Solu_Info_Array;
729: target : in Complex_Number; tol : in double_float;
730: p_path,p_end : in Pred_Pars; c_path,c_end : in Corr_Pars ) is
731:
732: -- DESCRIPTION :
733: -- This procedure implements the simultaneous continuation of
734: -- different solution paths.
735:
736: ninfi,nregu,nsing,nfail,nclus : natural := 0;
737: nb,index : natural;
738: blck : natural := block_size;
739:
740: begin
741: nb := 1; index := 0;
742: while index < s'last loop
743: if blck > s'last - index
744: then blck := s'last - index;
745: end if;
746: declare
747: sbk : Solu_Info_Array(1..blck) := s(index+1..index+blck);
748: begin
749: LContN1(file,sbk,target,tol,tol_path_distance,proj,p_path,c_path);
750: Continue_end_Game(file,sbk,target,tol,p_end,c_end);
751: s(index+1..index+blck) := sbk;
752: end;
753: nb := nb + 1;
754: index := index + blck;
755: end loop;
756: end Parallel_Continue;
757:
758: begin
759: ppa := Continuation_Parameters.Create_for_Path;
760: pen := Continuation_Parameters.Create_End_Game;
761: cpa := Continuation_Parameters.Create_for_Path;
762: cen := Continuation_Parameters.Create_End_Game;
763: if block_size = 1
764: then Sequential_Continue(file,sia,target,tol,ppa,pen,cpa,cen);
765: else Parallel_Continue(file,sia,target,tol,ppa,pen,cpa,cen);
766: end if;
767: Deep_Clear(sols);
768: sols := Shallow_Create(sia);
769: end Reporting_Toric_Continue;
770:
771: end Increment_and_Fix_Continuation;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>