Annotation of OpenXM_contrib/PHC/Ada/Continuation/driver_for_winding_numbers.adb, Revision 1.1.1.1
1.1 maekawa 1: with integer_io; use integer_io;
2: with Communications_with_User; use Communications_with_User;
3: with Timing_Package; use Timing_Package;
4: with File_Scanning; use File_Scanning;
5: with Standard_Floating_Numbers; use Standard_Floating_Numbers;
6: with Standard_Floating_Numbers_io; use Standard_Floating_Numbers_io;
7: with Standard_Complex_Numbers; use Standard_Complex_Numbers;
8: with Numbers_io; use Numbers_io;
9: with Standard_Complex_Vectors; use Standard_Complex_Vectors;
10: with Standard_Complex_Norms_Equals; use Standard_Complex_Norms_Equals;
11: with Standard_Complex_Polynomials; use Standard_Complex_Polynomials;
12: with Standard_Complex_Poly_Systems_io; use Standard_Complex_Poly_Systems_io;
13: with Homotopy;
14: with Standard_Complex_Solutions_io; use Standard_Complex_Solutions_io;
15: with Continuation_Parameters; use Continuation_Parameters;
16: with Continuation_Data; use Continuation_Data;
17: with Path_Trackers; use Path_Trackers;
18: with Drivers_for_Homotopy_Creation; use Drivers_for_Homotopy_Creation;
19: with Drivers_for_Poly_Continuation; use Drivers_for_Poly_Continuation;
20:
21: procedure Driver_for_Winding_Numbers
22: ( file : in file_type; p : in Poly_Sys;
23: sols : in out Solution_List ) is
24:
25: infile : file_type;
26: timer : timing_widget;
27: pp,q : Poly_Sys(p'range);
28: found,proj : boolean := false;
29: target : Complex_Number;
30: ans : character;
31: oc,max_wc : natural;
32:
33: procedure Write_Statistics_and_Condition
34: ( file : in file_type; i,nstep,nfail,niter,nsyst : in natural;
35: rcond : in double_float ) is
36:
37: -- DESCRIPTION :
38: -- Writes the computing statistics of the ith path on file, followed
39: -- by the estimate for the inverse of the condition number.
40:
41: begin
42: put(file,"========================================");
43: put_line(file,"===================================");
44: put(file,"== "); put(file,i,1); put(file," = ");
45: put(file," #step : "); put(file,nstep,3);
46: put(file," #fail : "); put(file,nfail,2);
47: put(file," #iter : "); put(file,niter,3);
48: if nsyst /= niter
49: then put(file," #syst : "); put(file,nsyst,3);
50: end if;
51: put(file," = ");
52: put(file," rco : "); put(file,rcond,2,3,3);
53: put_line(file," ==");
54: end Write_Statistics_and_Condition;
55:
56: procedure Winding_Numbers
57: ( file : in file_type; sols : in out Solution_List;
58: proj : in boolean; target : in Complex_Number;
59: mwc : in natural ) is
60:
61: -- DESCRIPTION :
62: -- Computes the winding number for the given list of solutions.
63:
64: -- REQUIRED :
65: -- The homotopy is already defined and stored in the package homotopy.
66:
67: sa : Solu_Info_Array(1..Length_Of(sols)) := Deep_Create(sols);
68: pen : Pred_Pars := Continuation_Parameters.Create_End_Game;
69: cen : Corr_Pars := Continuation_Parameters.Create_End_Game;
70: tol : constant double_float := 10.0**(-10);
71: epslop : constant double_float := 10.0**(-6);
72: wc : natural;
73: sum,allsum : Standard_Complex_Vectors.Vector(sa(sa'first).sol.v'range);
74:
75: procedure CCont2 is
76: new Circular_Single_Conditioned_Reporting_Continue
77: (Max_Norm,Homotopy.Eval,Homotopy.Diff,Homotopy.Diff);
78:
79: begin
80: for i in sa'range loop
81: if AbsVal(Create(1.0) - sa(i).sol.t) > epslop
82: then
83: CCont2(file,sa(i),target,tol,epslop,wc,mwc,sum,allsum,false,pen,cen);
84: sa(i).sol.m := wc;
85: sa(i).sol.v := allsum;
86: sa(i).sol.t := target;
87: Write_Statistics_and_Condition
88: (file,i,sa(i).nstep,sa(i).nfail,sa(i).niter,sa(i).nsyst,sa(i).rcond);
89: put(file,sa(i).sol.all);
90: end if;
91: end loop;
92: Clear(sols);
93: sols := Shallow_Create(sa);
94: end Winding_Numbers;
95:
96: begin
97: -- READING MAXIMUM WINDING NUMBER :
98: new_line;
99: put("Give the maximum winding number : "); Read_Natural(max_wc);
100: -- READING THE START SYSTEM :
101: new_line;
102: put_line("Reading the name of the file for start system.");
103: Read_Name_and_Open_File(infile); get(infile,q);
104: new_line;
105: put_line(file,"THE START SYSTEM :");
106: new_line(file); put(file,q); new_line(file);
107: -- CONSTRUCTING THE HOMOTOPY AND TUNING OF PARAMETERS :
108: Copy(p,pp);
109: Driver_for_Homotopy_Construction(file,pp,q,sols,target);
110: proj := (Number_of_Unknowns(q(q'first)) > q'last);
111: Driver_for_Continuation_Parameters(file);
112: new_line;
113: put("Do you want intermediate output during continuation ? (y/n) ");
114: Ask_Yes_or_No(ans);
115: if ans = 'y'
116: then Driver_for_Process_io(file,oc);
117: end if;
118: -- COMPUTATION OF WINDING NUMBERS :
119: new_line;
120: put_line("No more input desired. Computing winding numbers ...");
121: put_line("The program can now run in the background.");
122: new_line;
123: tstart(timer);
124: Winding_Numbers(file,sols,proj,target,max_wc);
125: tstop(timer);
126: new_line(file);
127: print_times(file,timer,"computation of winding numbers");
128: new_line(file);
129: end Driver_for_Winding_Numbers;
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>