summaryrefslogtreecommitdiff
path: root/Plasmapropagation.lpr
blob: b861d2e57bbeeed459b80ad9d8be36026f72b284 (plain)
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.