1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
|
program Plasmapropagation;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}{$IFDEF UseCThreads}
cthreads,
{$ENDIF}{$ENDIF}
Classes, SysUtils, CustApp,
{ you can add units after this }
math, Physikunit, crt, protokollunit;
var ErrorCode: longint;
type
{ TPlasmapropagation }
TPlasmapropagation = class(TCustomApplication)
protected
procedure DoRun; override;
public
constructor Create(TheOwner: TComponent); override;
destructor Destroy; override;
end;
{ TPlasmapropagation }
procedure TPlasmapropagation.DoRun;
var
Breite,i,j: longint;
simulation: tSimulation;
start,zeitDatei,zeitPhysik: extended;
FI: TFeldInhalt;
Abl: Boolean;
Prot: TProtokollant;
c: char;
begin
prot:=tProtokollant.create('error');
if paramcount<>1 then begin
prot.schreibe('Bitte genau einen Parameter übergeben, nämlich die Parameterdatei!',true);
halt(1);
end;
start:=now;
zeitDatei:=0;
zeitPhysik:=0;
sT:=-Min(deltaT,sDT)/2;
simulation:=tSimulation.create(paramstr(1));
// Gitter.Al:=@InputFeld;
while Gitter.t<Endzeit do begin
if HasOption('F','Fortschrittsanzeige') then begin
if errorCode<2 then
s:=Gitter.gibErhaltungsgroessen;
if (floor(100*Gitter.t/Endzeit) < floor(100*(Gitter.t+deltaT)/Endzeit)) or keypressed then begin
if keypressed then c:=readkey
else c:=#0;
case c of
#27,'q': begin
errorCode:=3;
break;
end;
' ': begin
writeln(' ... Pause (beliebige Taste drücken um fortzufahren) ...');
readkey;
writeln(' ... weiter geht''s ...');
end;
else begin
Prot.schreibe(inttostr(round(100*Gitter.t/Endzeit))+'% (t='+floattostr(Gitter.t)+'T)',true);
Prot.schreibe(timetostr(now-start)+' ('+floattostr(zeitPhysik/max(1e-11,zeitPhysik+zeitDatei))+')',true);
Prot.schreibe('ETA: '+timetostr((now-start)*(Endzeit-Gitter.t)/max(Gitter.t,deltaT)),true);
Prot.schreibe('aktueller Zeitschritt: '+floattostr(deltaT)+'T',true);
Prot.schreibe(s);
end;
end{of case};
end;
end;
zeitPhysik:=zeitPhysik-now;
if errorCode<2 then
Gitter.iteriereSchritt(deltaT);
zeitPhysik:=zeitPhysik+now;
zeitDatei:=zeitDatei-now;
while Gitter.t>=sT do begin
sT:=sT+sDT;
for j:=0 to length(Ausgabedateien)-1 do
Gitter.macheAusgabe(Ausgabedateien[j],sDX);
end;
zeitDatei:=zeitDatei+now;
end;
case errorCode of
2: Prot.schreibe('Simulation wurde auf halbem Wege abgebrochen wegen Überlaufs.',true);
3: Prot.schreibe('Simulation wurde auf halbem Wege abgebrochen wegen Benutzereingriffs.',true);
end{of case};
for i:=0 to length(Ausgabedateien)-1 do
CloseFile(Ausgabedateien[i].Datei);
Prot.schreibe('fertig!',true);
s:=timetostr(now-start);
t:=timetostr(zeitDatei);
u:=timetostr(zeitPhysik);
while length(s)<max(length(t),length(u)) do s:=' '+s;
while length(t)<max(length(s),length(u)) do t:=' '+t;
while length(u)<max(length(s),length(t)) do u:=' '+u;
Prot.schreibe('Das hat '+s+' gedauert,',true);
Prot.schreibe(' davon '+t+' für Dateizugriffe',true);
Prot.schreibe('und nur '+u+' für die eigentliche Physik!',true);
Gitter.Free;
Prot.Free;
// stop program loop
Terminate;
if errorCode=1 then errorCode:=0;
end;
constructor TPlasmapropagation.Create(TheOwner: TComponent);
begin
inherited Create(TheOwner);
errorCode:=1;
StopOnException:=True;
end;
destructor TPlasmapropagation.Destroy;
begin
inherited Destroy;
end;
var
Application: TPlasmapropagation;
begin
Application:=TPlasmapropagation.Create(nil);
Application.Run;
Application.Free;
Halt(errorCode);
end.
|